新浪微博API OAuth1 Python3客户端

#!/usr/local/bin/python3
# coding=gbk
# http://www.cnblogs.com/txw1958/
# 

import os, io, sys, re, time, base64, json
import webbrowser, urllib.request
import unittest


from weibopy.auth import OAuthHandler, BasicAuthHandler
from weibopy.api import API
from weibopy.api import WeibopError


class Test(unittest.TestCase):

    consumer_key = ""
    consumer_secret = ""

    def __init__(self, app_key, app_secret):
        """ constructor """
        self.consumer_key = app_key
        self.consumer_secret = app_secret

    def getAtt(self, key):
        try:
            return self.obj.__getattribute__(key)
        except Exception as e:
            print(e)
            return ''

    def getAttValue(self, obj, key):
        try:
            return obj.__getattribute__(key)
        except Exception as e:
            print(e)
            return ''

    #1.最老的认证方式,现在已不支持
    def basicAuth(self, source, username, password):
        self.authType = 'basicauth'
        self.auth = BasicAuthHandler(username, password)
        self.api = API(self.auth,source=source)

    #2.新的认证方式,目前新浪所支持的
    #   新浪源代码中需要手动添加,现在改为代码自动解析verifier
    def auth(self, username, password):

        if len(self.consumer_key) == 0:
            print("Please set consumer_key")
            return

        if len(self.consumer_key) == 0:
            print("Please set consumer_secret")
            return

        oauthFormat = "json" if True else "xml"
        self.auth = OAuthHandler(self.consumer_key, self.consumer_secret)
        auth_url = self.auth.get_authorization_url()
        auth_url = auth_url + '&oauth_callback=' + oauthFormat + '&userId=' + username +'&passwd=' + password
        #print('URL: ' + auth_url)
        if (oauthFormat == "xml"):
            xmlcontent = urllib.request.urlopen(auth_url)
            xmldoc = minidom.parse(xmlcontent)
            root = xmldoc.documentElement
            oauth_verifier = root.getElementsByTagName("oauth_verifier")[0]
            verifier = oauth_verifier.childNodes[0].data
        else:
            jsoncontent = urllib.request.urlopen(auth_url)
            stdout = jsoncontent.read().decode('utf-8')
            jsondatas = json.loads(stdout)
            verifier = jsondatas["oauth_verifier"]
        #print("Verifier: " + verifier)
        #verifier = input('PIN: ').strip()
        access_token = self.auth.get_access_token(verifier)
        self.api = API(self.auth)
        return access_token

    #3. 直接使用新的认证方式生成的已授权密码和密钥通讯,不需要重新认证
    #   将已授权密码和密钥保存下来,直接使用
    def setAccessToken(self, key, secret):
        self.auth = OAuthHandler(self.consumer_key, self.consumer_secret)
        self.auth.setAccessToken(key, secret)
        self.api = API(self.auth)


    #发布一条微博信息
    def update(self, message):
        status = self.api.update_status(lat='39', long='110', status=message)
        self.obj = status
        id = self.getAtt("id")
        text = self.getAtt("text")
        print("update---"+ str(id) +":"+ text)
        return int(id)

    #上传图片并发布一条微博信息
    #仅支持 'image/gif', 'image/jpeg', 'image/png'
    def upload(self, filename, message):
        status = self.api.upload(filename, status=message)
        self.obj = status
        id = self.getAtt("id")
        text = self.getAtt("text")
        self.obj = self.getAtt("user")
        profile_image_url  = self.getAtt("profile_image_url")
        print("upload,id="+ str(id) +",text="+ text +",image_name="+ filename)

    def uploadExt(self, filename, message, latPosition, longPosition):
        status = self.api.upload(filename, status=message, lat=latPosition, long=longPosition)
        self.obj = status
        id = self.getAtt("id")
        text = self.getAtt("text")
        self.obj = self.getAtt("user")
        profile_image_url  = self.getAtt("profile_image_url")
        print("upload,id="+ str(id) +",text="+ text +",profile_image_url="+ profile_image_url)

    #删除一条微博信息
    def destroy_status(self, id):
        status = self.api.destroy_status(id)
        self.obj = status
        id = self.getAtt("id")
        text = self.getAtt("text")
        print("destroy---"+ str(id) +":"+ text)

    #回复微博评论信息
    #个人理解:对某条消息id的评论cid的评论
    def reply(self, id, cid, message):
        status = self.api.reply(id, cid, message)
        self.obj = status
        id = self.getAtt("id")
        text = self.getAtt("text")
        print("reply---"+ str(id) +":"+ text)

    #转发一条微博信息(可加评论)id:微博id, message:评论
    def repost(self, id, message):
        status = self.api.repost(id, message)
        self.obj = status
        id = self.getAtt("id")
        text = self.getAtt("text")
        print("repost---"+ str(id) +":"+ text)

    #获取指定微博的评论列表: id:微博消息id
    def comments(self, id):
        comments = self.api.comments(id=id)
        for comment in comments:
            self.obj = comment
            mid = self.getAtt("id")
            text = self.getAtt("text")
            print("comments---"+ str(mid) +":"+ text)

    #获取当前用户发送及收到的评论列表: 5条
    def comments_timeline(self):
        comments = self.api.comments_timeline()
        for comment in comments:
            self.obj = comment
            mid = self.getAtt("id")
            text = self.getAtt("text")
            print("comments_timeline---"+ str(mid) +":"+ text)

    #获取当前用户发出的评论: number 评论条数, 返回最后一条评论的id
    def comments_by_me(self, number):
        comments = self.api.comments_by_me(count=number)
        mid = ''
        for comment in comments:
            self.obj = comment
            mid = self.getAtt("id")
            text = self.getAtt("text")
            created_at = self.getAtt("created_at")
            print('comments_by_me,id='+ str(mid) +',text='+ text+',created_at='+ str(created_at))
        return mid

    #评论指定微博: mid:微博id  content: 要评论的内容
    def comment(self, mid, comment_content):
        comment = self.api.comment(id=mid, comment=comment_content)
        self.obj = comment
        mid2 = self.getAtt("id")
        text = self.getAtt("text")
        print("mid: "+ str(mid2) +" test:"+ text)

    #删除当前用户的微博评论信息: mid 消息id
    def comment_destroy (self, mid):
        comment = self.api.comment_destroy(mid)
        self.obj = comment
        mid = self.getAtt("id")
        text = self.getAtt("text")
        print("comment_destroy---"+ str(mid) +":"+ text)

    #批量获取一组微博的评论数及转发数
    def counts(self):
        counts = self.api.counts(ids='3363780346175114,3366928917792687,1877120192')
        for count in counts:
            self.obj = count
            mid = self.getAtt("id")
            comments = self.getAtt("comments")
            rt = self.getAtt("rt")
            print("mentions---"+ str(mid) +":"+ str(comments) +":"+ str(rt))

    #私信,通过高级认证的应用key可以使用
    def direct_message(self):
        messages = self.api.direct_messages()
        mid = ''
        for msg in messages:
            self.obj = msg
            mid = self.getAtt("id")
            text = self.getAtt("text")
            print("direct_message---"+ str(mid) +":"+ text)
        return mid

    #我发送的私信列表
    def sent_direct_messages(self):
        messages = self.api.sent_direct_messages()
        for msg in messages:
            self.obj = msg
            mid = self.getAtt("id")
            text = self.getAtt("text")
            print("sent_direct_messages---"+ str(mid) +":"+ text)

    #发送私信
    def new_direct_message(self):
        msg = self.api.new_direct_message(id=1114365581,text='directMessages--test-测试-'+ str(time.time()))
        self.obj = msg
        mid = self.getAtt("id")
        text = self.getAtt("text")
        print("new_direct_message---"+ str(mid) +":"+ text)

    #删除一条私信
    def destroy_direct_message(self, id):
        msg = self.api.destroy_direct_message(id)
        self.obj = msg
        mid = self.getAtt("id")
        text = self.getAtt("text")
        print("destroy_direct_message---"+ str(mid) +":"+ text)

    #获取当前用户的收藏列表
    def favorites(self):
        statuses = self.api.favorites(id=2)
        for status in statuses:
            self.obj = status
            sid = self.getAtt("id")
            text = self.getAtt("text")
            print("favorites---"+ str(sid) +":"+ text)

    #添加收藏: id:消息id
    def create_favorite(self, id):
        status = self.api.create_favorite(id)
        self.obj = status
        sid = self.getAtt("id")
        text = self.getAtt("text")
        print("create_favorite---"+ str(sid) +":"+ text)

    #删除当前用户收藏的微博信息 : id:消息id
    def destroy_favorite(self, id):
        msg = self.api.destroy_favorite(id)
        self.obj = msg
        mid = self.getAtt("id")
        text = self.getAtt("text")
        print("destroy_favorite---"+ str(mid) +":"+ text)

    #关注某用户: fid 用户id
    def create_friendship(self, fid):
        user = self.api.create_friendship(id=fid)
        self.obj = user
        uid = self.getAtt("id")
        screen_name = self.getAtt("screen_name")
        print("create_friendship---"+ str(uid) +":"+ screen_name)

    #取消关注: fid 用户id
    def destroy_friendship(self, fid):
        user = self.api.destroy_friendship(id=fid)
        self.obj = user
        uid = self.getAtt("id")
        screen_name = self.getAtt("screen_name")
        print("destroy_friendship---"+ str(uid) +":"+ screen_name)

    #是否关注某用户:用户a是否关注用户b
    def exists_friendship(self, user_a_id, user_b_id):
        self.obj = self.api.exists_friendship(user_a=user_a_id, user_b=user_b_id)
        friends = self.getAtt("friends")
        print("exists_friendship--- "+ str(friends))

    #是否互相关注: uid: 用户id : 似乎没有用
    def show_friendship(self, uid):
        showList = self.api.show_friendship(target_id=uid)
        for obj in showList:
            self.obj = obj
            uid = self.getAtt("id")
            screen_name = self.getAtt("screen_name")
            print("show_friendship---"+ str(uid) +":"+ screen_name)

    #是否为我的关注用户
    def is_my_attention(self, uid):
        self.obj = self.api.exists_friendship(user_a=myuserid, user_b=uid)
        friends = self.getAtt("friends")
        print(str(friends))
        return friends

    #是否为我的粉丝用户
    def is_my_follower(self, uid):
        self.obj = self.api.exists_friendship(user_a=uid, user_b=myuserid)
        friends = self.getAtt("friends")
        print(str(friends))
        return friends

    #显示当前登录用户id
    def show_self_id(self):
        global myuserid
        showList = self.api.show_friendship(target_id=opposite_id) #存在的id号
        self.obj = showList[0]
        myuserid= self.getAtt("id")
        screen_name = self.getAtt("screen_name")
        print("\nuid: " + str(myuserid) + " name: " + str(screen_name))
        return myuserid

    #根据id显示用户信息
    def show_opposite_id(self, opposite_id):
        showList = self.api.show_friendship(target_id=opposite_id) #存在的id号
        self.obj = showList[1]
        #opposite_id= self.getAtt("id")
        screen_name = self.getAtt("screen_name")
        print("uid: " + str(opposite_id) + " name: " + str(screen_name))
        return opposite_id

    #根据id显示用户昵称_新
    def get_user_nickname(self, opposite_id):
        showList = self.api.get_user(user_id=opposite_id) #存在的id号
        self.obj = showList
        opposite_id= self.getAtt("id")
        screen_name = self.getAtt("screen_name")
        #print("uid: " + str(opposite_id) + " name: " + str(screen_name))
        return screen_name

    #根据id获取用户信息:关注的人数
    def get_friends_count(self, uid):
        showList = self.api.get_user(user_id = uid)
        self.obj = showList
        screen_name = self.getAtt("screen_name")
        description = self.getAtt("description")
        followers_count = self.getAtt("followers_count") #int
        friends_count = self.getAtt("friends_count")
        statuses_count = self.getAtt("statuses_count")
        return friends_count

    #根据id获取用户信息:
    def get_user_info_list(self, uid):
        showList = self.api.get_user(user_id = uid)
        user_info_list = showList
        return user_info_list

    #关注列表:我关注的用户: 20个
    def friends(self):
        timeline = self.api.friends()
        for line in timeline:
            self.obj = line
            fid = self.getAtt("id")
            name = self.getAtt("screen_name")
            print("friends---"+ str(fid) +":"+ name)

    #获取当前用户所关注用户的最新微博信息 2条
    def friends_timeline(self):
        twitter_dict = []
        timeline = self.api.friends_timeline(count=2, page=1)
        for line in timeline:
            self.obj = line
            mid = self.getAtt("id")
            text = self.getAtt("text")
            twitter_dict.append({'mid': mid, 'txt': text})
            print("friends_timeline---"+ str(mid) +":"+ text)
        return twitter_dict

    #获取当前用户发送及收到的评论列表 2条
    def comments_timeline(self):
        timeline = self.api.comments_timeline(count=2, page=1)
        for line in timeline:
            self.obj = line
            mid = self.getAtt("id")
            text = self.getAtt("text")
            print("comments_timeline---"+ str(mid) +":"+ text)

    #获取指定用户发布的微博信息列表:
    def user_timeline(self, userid, amount):
        timeline = self.api.user_timeline(uid=userid, count=amount)
        for line in timeline:
            self.obj = line
            mid = self.getAtt("id")
            text = self.getAtt("text")
            created_at = self.getAtt("created_at")
            print("user_timeline---"+ str(mid) +":"+ text)

    #获取用户发布的微博信息列表 5条
    def user_timeline_dict(self, amount):
        user_msg_dict = []
        timeline = self.api.user_timeline(count=amount, page=1)
        for line in timeline:
            self.obj = line
            mid = self.getAtt("id")
            text = self.getAtt("text")
            user_msg_dict.append({'id': mid, 'text': text})
            print("user_timeline---"+ str(mid) +":"+ text)
        return user_msg_dict

    #获取用户发布的微博信息列表 5条
    def user_timeline_pages(self, amount, pagenumber):
        user_msg_dict = []
        timeline = self.api.user_timeline(count=amount, page=pagenumber)
        for line in timeline:
            self.obj = line
            mid = self.getAtt("id")
            text = self.getAtt("text")
            user_msg_dict.append({'id': mid, 'text': text})
            print("user_timeline---"+ str(mid) +":"+ text)
        return user_msg_dict

    #获取最新更新的公共微博消息 2条
    def public_timeline(self):
        timeline = self.api.public_timeline(count=2, page=1)
        for line in timeline:
            self.obj = line
            mid = self.getAtt("id")
            text = self.getAtt("text")
            print("public_timeline---"+ str(mid) +":"+ text)

    #获取最新更新的公共微博消息 1 条返回 mid
    def public_timeline_mid(self):
        timeline = self.api.public_timeline(count=2, page=1)
        for line in timeline:
            self.obj = line
            mid = self.getAtt("id")
            return mid

    #关注列表
    def friends_ids(self):
        fids = self.api.friends_ids()
        self.obj = fids
        ids = self.getAtt("ids")
        next_cursor = self.getAtt("next_cursor")
        previous_cursor = self.getAtt("previous_cursor")
        print("friends_ids---"+ str(ids) +":next_cursor"+ str(next_cursor) +":previous_cursor"+ str(previous_cursor))
        return ids

    #关注列表 全部  (用户名)
    def friends_ids_ex(self):
        fids = self.api.friends_ids()
        self.obj = fids
        ids = self.getAtt("ids")

        for line in ids:
            self.obj = line
            fid = self.getAtt("id")
            name = self.getAtt("screen_name")
            print("friends---"+ str(fid) +":"+ name)


    #粉丝列表 全部
    def followers_ids(self):
        fids = self.api.followers_ids()
        self.obj = fids
        ids = self.getAtt("ids")
        next_cursor = self.getAtt("next_cursor")
        previous_cursor = self.getAtt("previous_cursor")
        print("followers_ids---"+ str(ids) +":next_cursor"+ str(next_cursor) +":previous_cursor"+ str(previous_cursor))
        return ids

    #获取@当前用户的微博列表 全部
    def mentions(self):
        comments = self.api.mentions()
        for comment in comments:
            self.obj = comment
            mid = self.getAtt("id")
            text = self.getAtt("text")
            print("mentions---"+ str(mid) +":"+ text)

    #获取隐私信息
    ##comment : 谁可以评论此账号的微薄。0:所有人,1:我关注的人。
    ##dm : 谁可以给此账号发私信。0:所有人,1:我关注的人。
    ##real_name: 是否允许别人通过真实姓名搜索到我, 0允许,1不允许。
    ##geo : 发布微博,是否允许微博保存并显示所处的地理位置信息。 0允许,1不允许。
    ##badge : 勋章展现状态,值—1私密状态,0公开状态。
    def get_privacy(self):
        privacy = self.api.get_privacy()
        self.obj = privacy
        ct = self.getAtt("comment")
        dm = self.getAtt("dm")
        real_name = self.getAtt("real_name")
        geo = self.getAtt("geo")
        badge = self.getAtt("badge")
        print ("privacy---"+ str(ct) + str(dm) + str(real_name) + str(geo) + str(badge))

    #设置隐私信息
    def update_privacy(self):
        update_privacy = self.api.update_privacy(comment=0)

    #获取请求次数限制信息
    #-针对一个用户在使用一个应用的请求次数限制
    #-普通授权:
    #-总限制:单用户每应用 150次/小时
    #-发微博:单用户每应用 30次/小时
    #-发评论:单用户每应用 60次/小时
    #-加关注:单用户每应用 60次/小时 200次/天
    #-{
    #-   "hourly_limit":150,                              #本小时内剩余数量 150 次,
    #-   "reset_time_in_seconds":1264994122,              #计数器重置剩余时间1264994122,秒,
    #-   "reset_time":"Mon Feb 01 03:15:22 +0800 2010",   #下次重置时间03:15:22点。
    #-   "remaining_hits":150                             #剩余访问数量 150 次,
    #-}
    def rate_limit_status(self):
        limit_status = self.api.rate_limit_status()
        self.obj = limit_status
        hourly_limit = self.getAtt("hourly_limit")
        reset_time_in_seconds = self.getAtt("reset_time_in_seconds")
        reset_time = self.getAtt("reset_time")
        remaining_hits = self.getAtt("remaining_hits")
        print ("hourly_limit---" + str(hourly_limit))
        print ("reset_time_in_seconds---" + str(reset_time_in_seconds))
        print ("reset_time---" + str(reset_time))
        print ("remaining_hits---" + str(remaining_hits))

    #添加用户标签
    def tag_create(self, message):
        message = message.encode("utf-8")
        tag_create = self.api.tag_create(tags=message)
        for line in tag_create:
            self.obj = line
            tagid = self.getAtt("tagid")
            print ("tag_create---"+tagid)

    #返回用户感兴趣的标签 10条
    def tag_suggestions(self):
        tag_suggestions=self.api.tag_suggestions()
        for line in tag_suggestions:
            self.obj = line
            id = self.getAtt("id")
            value = self.getAtt("value")
            print ("tag_suggestions---"+ id +":"+ value)

    #删除标签 tag_id 标签id
    def tag_destroy(self,tag_id):
        tag_destroy=self.api.tag_destroy(tag_id)
        self.obj=tag_destroy
        result=self.getAtt("result")
        print ("tag_destroy---"+ result)

    #批量删除标签
    def tag_destroy_batch(self,tag_ids):
        tag_destroy_batch=self.api.tag_destroy_batch(tag_ids)
        for line in tag_destroy_batch:
            self.obj = line
            tagid=self.getAtt("tagid")
            print ("tag_destroy_batch---"+ tagid)

    #获取某人的话题 uid 用户id
    def trends(self, uid):
        trends = self.api.trends(user_id=uid, count=20, page=1)
        for line in trends:
            self.obj=line
            num = self.getAtt("num")
            trend_id = self.getAtt("trend_id")
            hotword = self.getAtt("hotword")
            print ("trends---"+ num +":"+ hotword +":"+trend_id)

    #新浪未提供测试代码
    def trends_statuses(self , message):
        message = message.encode("utf-8")
        trends_statuses = self.api.trends_statuses(message)
        for line in trends_statuses:
            self.obj=line
            id = self.getAtt("id")
            text = self.getAtt("text")
            print ("ToReader---"+ str(id) + ":" +text)
            #print text

    #关注某一个话题
    def trends_follow(self , message):
        message = message.encode("utf-8")
        trends_follow = self.api.trends_follow(message)

    #取消关注的某一个话题
    def trends_destroy(self , id):
        trends_destroy=self.api.trends_destroy(id)

    #按小时返回热门话题
    def trends_hourly(self):
        trends_hourly = self.api.trends_hourly(base_app=0)
        self.obj=trends_hourly
        query = self.getAtt("trends")
        as_of = self.getAtt("as_of")
        for key in query:
            key = time.strftime('%Y-%m-%d',time.localtime(as_of))
            for line in query[key]:
                query = line["query"]
                name = line["name"]
                print ("trends_hourly---"+" Query:" + query + ", Name:"+ name)

    #返回最近一天内的热门话题
    def trends_daily(self):
        trends_daily=self.api.trends_daily(base_app=0)
        self.obj=trends_daily
        query=self.getAtt("trends")
        as_of=self.getAtt("as_of")
        for key in query:
            key=time.strftime('%Y-%m-%d',time.localtime(as_of))
            for line in query[key]:
                query=line["query"]
                name=line["name"]
                print ("trends_daily---"+"Query:" + query+",Name:"+ name)

    #返回当周热门话题
    def trends_weekly(self):
        trends_weekly=self.api.trends_weekly(base_app=0)
        self.obj=trends_weekly
        query=self.getAtt("trends")
        as_of=self.getAtt("as_of")
        for key in query:
            key = time.strftime('%Y-%m-%d',time.localtime(as_of))
            for line in query[key]:
                query=line["query"]
                name=line["name"]
                print ("trends_weekly---"+"Query:" + query+",Name:"+ name)

    #按小时返回热门话题
    def trends_hourly(self, number):
        index = 0
        trends_hourly = self.api.trends_hourly(base_app=0)
        self.obj = trends_hourly
        query = self.getAtt("trends")
        as_of = self.getAtt("as_of")
        for key in query:
            key = time.strftime('%Y-%m-%d',time.localtime(as_of))
            for line in query[key]:
                if index == 10:
                    return
                index +=1
                query = line["query"]
                name = line["name"]
                print ("trends_hourly---"+" Query:" + query + ", Name:"+ name)

    #获取当前用户未读消息数
    def unread(self):
        count = self.api.unread()
        self.obj = count
        mentions = self.getAtt("mentions")
        comments = self.getAtt("comments")
        followers = self.getAtt("followers")
        dm = self.getAtt("dm")
        print("mentions---"+ str(mentions) +":"+ str(comments) +":"+ str(followers) +":"+ str(dm))

    #更改头像
    def update_profile_image (self, filename):
        user = self.api.update_profile_image(filename)
        self.obj = user
        id = self.getAtt("id")
        profile_image_url = self.getAtt("profile_image_url")
        print("update,uid="+ str(id) +",profile_image_url="+ profile_image_url)

def main():
    "main function"
    print(base64.b64decode(b'Q29weXJpZ2h0IChjKSAyMDEyIERvdWN1YmUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLg==').decode())
    
    for user_index in userInfo.user_info_temp:
        try:
            user_title          = user_index['user']['title']
            user_uid            = user_index['user']['uid']
            user_nickname       = user_index['user']['nickname']
            login_account       = user_index['login']['account']
            login_password      = user_index['login']['password']
            app_key             = user_index['app']['key']
            app_secret          = user_index['app']['secret']
            access_token_key    = user_index['token']['key']
            access_token_secret = user_index['token']['secret']
 
            test = Test(app_key, app_secret)
            test.auth(login_account, login_password)
            test.show_self_id()
            test.direct_message()
            test.user_timeline(20)
            test.comments(3386439134314734)

            print()

        except WeibopError as err:
            print(">>>>>> WeibopError: " + err.reason)
        except Exception as error:
            print(">>>>>> PythonError " + str(error))
        else:
            None
        finally:
            None

if __name__ == '__main__':
    main()

 

posted on 2013-07-23 17:06  岚之山  阅读(165)  评论(0编辑  收藏  举报

导航