2013-12-20 1 views
2

Я хочу войти, а затем отредактировать страницу. Я могу получить edittoken, но когда я передаю его action = edit, он говорит badtoken. Мне что-то не хватает?страница редактирования Wikipedia, 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() 
+1

Вы можете использовать мой пример, но это с запросами: https://github.com/bunyk/bwikibot/blob/master/api2.py#L29 – Bunyk

+1

Отлично! Я должен использовать request.session(). Это решило мою проблему. Благодарю. – Gqqnbig

ответ

1

Я отвечаю на свой вопрос. Просто используйте requests.session(), а не сеансовую requests.get и post.

 Смежные вопросы

  • Нет связанных вопросов^_^