首页 > Tech > 一起登陆钓鱼岛

一起登陆钓鱼岛

2012年9月12日 发表评论 阅读评论 659 Views  

随着日本“购岛”事件愈演愈烈,我等屁民虽然无法像保钓人士一样登岛,但也可以用我们自己的方式登岛宣誓主权,比如在新浪微博上登陆钓鱼岛。登陆上钓鱼岛以后是下面这个样子的:
登陆钓鱼岛

是不是很神奇?


事实上很简单,只要了解了新浪微博的地理位置API,你就可以出现在地球上任何一个角落。下面是详细介绍:

  1. 在新浪开放平台上创建一个应用,在开放平台-我的应用下面创建新的应用,注意填好授权回调页和取消授权回调页地址(如果没有的话就填默认页https://api.weibo.com/oauth2/default.html),记下申请到的App Key和App Secret备用。

    创建新应用

    OAuth授权

  2. 下载新浪微博SDK,选一种你熟悉的语言,我用了python,python sdk地址在这里
  3. 编程实现登录微博的功能。新浪微博采用了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粘贴至浏览器地址栏对应用进行授权,授权后就能使用该代码自动登陆了。
  4. 调用新浪微博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)

参考资料:

分类: Tech 标签: , , ,