如何使用 mediawiki 的 api、curl 和 bash 登录?

How to login using mediawiki's api, curl, and bash?

我对过程的理解:
来自 mediawikis 登录手册 https://www.mediawiki.org/wiki/API:Login

When using MediaWiki's web service API, you will probably need your application or client to log in. This involves submitting a login query, constructing a cookie, and confirming the login by resubmitting the login request with the confirmation token returned.

1) 尝试使用用户名和密码登录,这将失败并返回 'result="NeedToken"' 作为响应 html 的一部分。响应还将包含要为下一次登录尝试传递的令牌。
2) 尝试再次登录,这次除了 un/pw 之外还传入令牌。这应该 return 和 'result="Success"'

我的代码:

###Attempt first login setup cookie jar
loginRes1=$(curl --cookie-jar cjar -X POST "$domain/wiki/api.php?action=login&lgname=$lgname&lgpassword=$lgpassword")

###Grab the token from login attempt
lgtoken=$(echo $loginRes1 |sed -rn "s/.*token="([0-9a-zA-Z]+)".*//p" )

###Attempt second login, this time passing token as well
loginRes2=$(curl --cookie-jar cjar -X POST "$domain/wiki/api.php?action=login&lgname=$lgname&lgpassword=$lgpassword&lgtoken=$lgtoken")

结果:

echo $loginRes1
###Only relevant html from echo shown below, cleaned up into xml syntax
<?xml version="1.0"?> <api> <login result="NeedToken" token="944af711913a037cfb8b90d477d51f6c" cookieprefix="ronk" sessionid="isqvhm955lj35g1q2e2klme091" /> </api> 

echo $loginRes2 
###Only relevant html from echo shown below, cleaned up into xml syntax
<?xml version="1.0"?> <api> <login result="NeedToken" token="ffdd1aa6dc3699df26b9de6dd1c6d5a5" cookieprefix="ronk" sessionid="fdahoh4gh7junrqm1tk2p1qd25" /> </api> 

我第二次仍然得到 NeedToken 结果,而不是我预期的成功。

通过浏览器登录
我可以使用带有表单提交的浏览器正常登录,post 请求包含 4 个参数:wpName、wpPassword、wpLoginAttempt、wpLoginToken

wpName=myName&wpPassword=myPassword&wpLoginAttempt=Log+in&wpLoginToken=d3fe3a1de6fbc934acd3039149f3c56d


其他注意事项
1) 我确认 un/pw 在通过浏览器正常登录时有效。
2) 我不清楚我是否正确使用了 curl cookie-jar 语法
3) 我不知道我正在连接的 mediawiki 版本,它是最近安装的,可能是最高稳定版本。
4) 您会注意到在成功的浏览器尝试中,参数具有 wp 前缀而不是 lg,如果我更改 curl 尝试匹配(即 wpName、wpPassword),那么 returned 结果是:

<?xml version="1.0"?> <api> <warnings> <main xml:space="preserve">Unrecognized parameters: 'wpName', 'wpPassword'</main> </warnings> <login result="NoName" /> </api> 

curl 的 --cookie-jar 选项只告诉 curl 将 cookie 保存到罐子中。它不会告诉 curl 从罐子中 load cookies。

要使 curl 从 jar 加载 cookie,您需要使用 -b 选项指定要使用的 cookie jar。