利用微博的开放的接口,加上大佬的weibo sdk包,最后使用post.statuses update方法
来提交post请求,从而发一条微博。使用它的get方法的时候都没有问题的,但是一使用它的post中的请求的时候就会出问题:
urllib.error.HTTPError: HTTP Error 403: Forbidden
下面是我整个的代码:
from weibo import APIClient
import urllib.request
import urllib.parse
def weibo():
APP_KEY = '528248027'
APP_SECRET = '4dfcbaf24dc2341d41aea5b462ac61f6'
CALLBACK_URL = 'https://api.weibo.com/oauth2/default.html'
OAUTH_URL = 'https://api.weibo.com/oauth2/default.html'
USER_ID = '6270069375'
PASSWORD = '19981027lcy'
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
refer_url = client.get_authorize_url()
print("refer_url is :", refer_url)
cookies = urllib.request.HTTPCookieProcessor()
opener = urllib.request.build_opener(cookies)
urllib.request.install_opener(opener)
postdata = {
'client_id': APP_KEY,
'redirect_uri': CALLBACK_URL,
'userId': USER_ID,
'passwd': PASSWORD,
'isLoginSina': "1",
'action': 'submit',
'response_type': 'code'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
'Host': 'open.weibo.com',
'Referer': refer_url
}
req = urllib.request.Request(
url=OAUTH_URL,
data=urllib.parse.urlencode(postdata).encode(encoding='UTF8'),
headers=headers,
)
resp = urllib.request.urlopen(req)
print('callback url is :', resp.geturl())
pat = 'code=(.*?)$'
print(resp.geturl())
code = input('input code:')
print('code is :', code)
r = client.request_access_token(code, redirect_uri=CALLBACK_URL)
access_token1 = r.access_token
expires_in = r.expires_in
print('access_token=', access_token1)
print('expires_in=', expires_in)
#client.set_access_token(access_token1, expires_in)
return client, access_token1, refer_url, expires_in
def main():
client, access_token, refer_url, expires_in = weibo()
client.set_access_token(access_token=access_token, expires_in=expires_in)#已经设置的授权,所有的get方法都是行得通的,就是不能提交post请求
print('用户id:', client.get.account__get_uid())
result5 = client.post.statuses__update(source='528248027', status='写一个小微博', geo_enabled=True)#发一条微博
print(result5)
if __name__ == '__main__':
main()
这个要是放在爬虫里面,就是需要加一些headers就可以解决了,但是在这里面,我已经获得授权了,就是已经设置过了client的access_token:
client.set_access_token(access_token=access_token, expires_in=expires_in)