Skip to main content
 首页 » 编程设计

python之维基百科上的编辑页面,badtoken

2025年05月04日10qlqwjy

我想登录然后编辑页面。我可以得到 edittoken,但是当我把它传递给 action=edit 时,它说 badtoken。我错过了什么吗?

__apiJson__ = "https://zh.wikipedia.org/w/api.php?format=json&" 
def login(): 
    username = "???" #use your own 
    password = "???" #use your own 
 
    username = urllib.parse.quote(username) 
    password = urllib.parse.quote(password) 
 
    r = requests.post(__apiJson__ + "action=login&lgname={username}&lgpassword={password}". 
                      format(username=username,password=password)) 
 
    content = r.json() 
    content = content['login'] 
    if(content['result'] == 'NeedToken'): 
        cookies = r.cookies 
        token = content['token'] 
        r = requests.post(__apiJson__ + "action=login&lgname={username}&lgpassword={password}&lgtoken={token}". 
                      format(username=username,password=password,token=token),cookies=cookies) 
        content = r.json() 
        content = content['login'] 
        assert content['result']=="Success" 
    return r.cookies 
 
def getEditToken(archivePage): 
    r = requests.post(__apiJson__ + "action=query&prop=info&intoken=edit&titles={title}".format(title=archivePage),cookies=cookies) 
    content = r.json() 
    content = content['query']['pages'] 
    content = content[list(content.keys())[0]] 
    editToken = content['edittoken'] 
 
    if(editToken == '+\\'): 
        raise Exception() 
    return editToken 
 
cookies = login() 
 
editToken = getEditToken("User:???/test") #use your own 
 
editToken=urllib.parse.quote(editToken) 
 
r = requests.post("https://zh.wikipedia.org/w/api.php?action=edit&format=json&title=User:Gqqnb/沙盒&text=helloworld&summary=test&token={token}".format(token=editToken), 
                  cookies=cookies,headers={"Content-Type":"application/x-www-form-urlencoded"}) 
 
 
content = r.json() 

请您参考如下方法:

我回答我自己的问题。只需使用 requests.session(),而不是无 session 的 requests.get 和 post。