一起登陆钓鱼岛
随着日本“购岛”事件愈演愈烈,我等屁民虽然无法像保钓人士一样登岛,但也可以用我们自己的方式登岛宣誓主权,比如在新浪微博上登陆钓鱼岛。登陆上钓鱼岛以后是下面这个样子的:
是不是很神奇?
事实上很简单,只要了解了新浪微博的地理位置API,你就可以出现在地球上任何一个角落。下面是详细介绍:
- 在新浪开放平台上创建一个应用,在开放平台-我的应用下面创建新的应用,注意填好授权回调页和取消授权回调页地址(如果没有的话就填默认页https://api.weibo.com/oauth2/default.html),记下申请到的App Key和App Secret备用。
- 下载新浪微博SDK,选一种你熟悉的语言,我用了python,python sdk地址在这里。
- 编程实现登录微博的功能。新浪微博采用了OAuth2.0的方式认证,这里介绍了如何使用python SDK进行新浪微博OAuth2.0认证。用户授权后,将跳转至网站回调地址,并附加参数code=xxxxxx,为了实现认证认证,需要获取URL参数code。但是这篇文章里并没有说明如何自动获取到该code,只能手动将url=client.get_authorize_url()执行后得到的url(形如https://api.weibo.com/oauth2/authorize?redirect_uri=https%3A//api.weibo.com/oauth2/default.html&response_type=code&client_id=2156401994&display=default)粘贴至浏览器地址栏后,用户进行授权得到。这样只需要模拟登录授权获取sina webio OAuth2.0的code,就能实现自动登陆了,这篇文章给出了模拟登录授权获取sina webio OAuth2.0的code的Python代码,但第一次登陆仍要手动将url粘贴至浏览器地址栏对应用进行授权,授权后就能使用该代码自动登陆了。
- 调用新浪微博API接口发微博:先在Google Earth上找到钓鱼岛的经纬度(lat=25.744,long=123.477),然后调用weibo.client.post.statuses__update(status=u’钓鱼岛是中国的!’,lat=25.744,long=123.477)就能占领钓鱼岛了!
最后是一点干货,我对以上提到文章中的代码稍作修改,用一个类包装了APIClient,实现了自动登录过程,占领钓鱼岛的完整代码如下:
#!/usr/bin/python #coding=utf-8 from weibo import APIClient import urllib2 import urllib # weibo api访问配置 APP_KEY = '' # app key APP_SECRET = '' # app secret CALLBACK_URL = 'https://api.weibo.com/oauth2/default.html' # callback url 授权回调页,与OAuth2.0 授权设置的一致 AUTH_URL = 'https://api.weibo.com/oauth2/authorize' USERID = 'xxx' # 微博用户名 USERPASSWD = 'xxx' # 用户密码 class PyWeibo: def __init__(self): self.client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL) def getAuthCode(self, referer_url): cookies = urllib2.HTTPCookieProcessor() opener = urllib2.build_opener(cookies) urllib2.install_opener(opener) postdata = {"client_id": APP_KEY, "redirect_uri": CALLBACK_URL, "userId": USERID, "passwd": USERPASSWD, "isLoginSina": "0", "action": "submit", "response_type": "code", } headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0", "Host": "api.weibo.com", "Referer": referer_url } req = urllib2.Request( url = AUTH_URL, data = urllib.urlencode(postdata), headers = headers ) try: resp = urllib2.urlopen(req) print "callback url is : %s" % resp.geturl() print "code is : %s" % resp.geturl()[-32:] except Exception, e: print e return resp.geturl()[-32:] def login(self): url = self.client.get_authorize_url() print "referer url is : %s" % url # 获取URL参数code: code = self.getAuthCode(url) r = self.client.request_access_token(code) access_token = r.access_token # 新浪返回的token,类似abc123xyz456 expires_in = r.expires_in # token过期的UNIX时间:http://zh.wikipedia.org/wiki/UNIX%E6%97%B6%E9%97%B4 # TODO: 在此可保存access token self.client.set_access_token(access_token, expires_in) weibo = PyWeibo() weibo.login() weibo.client.post.statuses__update(status=u'#钓鱼岛是中国的#',lat=25.744,long=123.477)