Day 9148 饭否OAuth 2 API黑箱摸索笔记

饭否的API上次更新已经比网页版还要古老了,传说中的2.0版API只出了一个草稿,后来因为各种原因中止了开发,从此杳无音讯。

OAuth 2.0比1.0减少了繁琐且容易出错(还很难找到原因)的签名过程,但前提是依赖https的加密传输,所以饭否允许在http协议下使用OAuth 2.0的做法其实是不对的,但已经没有人管了,反正证书都过期了。

以下为参考草稿及API Wiki中散落的2.0 API说明文档整理的黑箱笔记。

首先说明一点:API 2.0完全处于草稿状态,经过整理,发现很多地方的权限都是错乱的,既无法用来探寻不应该看到的东西(喂),也导致本应可以正常使用的API无法动作,所以完全、丝毫、整个就不能用来开发客户端。

  1. API Consumer获取方法
    请咨询@HAL9K,目前OAuth 2.0的Consumer只能由管理人员在后台添加,不能自助申请。
  2. Token获取过程
    详细请参考官方文档,这里只做简要介绍:
    一、传统Authorization Code换Access Token法:
    1、https://fanfou.com/oauth2/authorize?redirect_uri=应用Authorize回调地址&client_id=ClientID&response_type=code
    2、用户同意授权后会转向【回调地址?code={authorization code}
    3、https://fanfou.com/oauth2.token?client_id=ClientID&client_secret=ClientSecret&redirect_uri=应用AccessToken获取回调地址&code=AuthorizationCode&grant_type=authorization_code
    4、服务器验证成功后会返回以下json:
    {
    “access_token”: “~68NKILzDyRs-c538eb0be6ce843ac6ca3c7fc81a0e72”, //Access Token
    “expires_in”: 3600, //Access Token有效期
    “scope”: null, //应用授权范围(暂未生效)
    “refresh_token”: “~68NKILzDyRs-82671540cdf1f716a87a9d95c2fbce0a” //Refresh Token
    }
    二、直接用Client ID获取Access Token法:
    1、https://fanfou.com/oauth2/authorize?client_id=ClientID&redirect_uri=回调地址&response_type=token
    2、用户同意授权后会直接转向【回调地址#access_token=AccessToken&expires_in=3600&refresh_token=RefreshToken
    此方法看似简单有效,但却会将Access Token暴露在URL中,故除调试外并不推荐使用。
  3. 黑箱笔记:
    ————————————————————————————
    /statuses/
    ————————————————————————————
    /home_timeline/
    方法说明:显示当前登录用户的Timeline
    调用方法:GET https://rest.fanfou.com/statuses/home_timeline/?oauth_token={OA2_TOKEN}
    可用参数:
    count 可选 返回消息的条数,可选范围[1,60]
    page 可选 返回结果的页码
    since_id 可选 返回消息ID > since_id的消息
    max_id 可选 返回消息ID ≤ max_id的消息
    测试结果:
    显示的是UID=0的Timeline,无法正常使用

    /user_timeline/:userid/
    方法说明:显示指定用户已发送的消息
    调用方法:GET https://rest.fanfou.com/statuses/user_timeline/{USER_ID}/?oauth_token={OA2_TOKEN}
    可用参数:
    :userid 必选 指定用户ID,@~me为当前用户
    count 可选 返回消息的条数,可选范围[1,60]
    page 可选 返回结果的页码
    since_id 可选 返回消息ID > since_id的消息
    max_id 可选 返回消息ID ≤ max_id的消息
    测试结果:
    @~me(未锁) 返回error: Can not view user,无法使用
    @~me(已锁) 返回error: Can not view user,无法使用
    未锁用户 返回该用户的消息json数组,可以正常使用
    已锁且已关注用户 返回error: Can not view user,无法使用
    已锁但未关注用户 返回error: Can not view user,姑且认定为工作正常

    /mentions/
    方法说明:显示提到当前用户的信息
    调用方法:GET https://rest.fanfou.com/statuses/mentions/?oauth_token={OA2_TOKEN}
    可用参数:
    count 可选 返回消息的条数,可选范围[1,60]
    page 可选 返回结果的页码
    since_id 可选 返回消息ID > since_id的消息
    max_id 可选 返回消息ID ≤ max_id的消息
    测试结果:
    使用的是UID=0的权限,不知道显示的是哪里的Mentions,无法正常使用

    /photo_timeline/:userid/
    方法说明:从名称猜测应该为显示用户的相册
    调用方法:GET https://rest.fanfou.com/statuses/photo_timeline/{USER_ID}/?oauth_token={OA2_TOKEN}
    测试结果:返回error: Route rule not found,无法使用

    /:statusid
    方法说明:显示指定ID的消息
    调用方法:GET https://rest.fanfou.com/statuses/{STATUS_ID}?oauth_token={OA2_TOKEN}
    可用参数:
    :statusid 必选 消息的ID
    测试结果:在消息发布者对当前用户可见且消息没有被删除的情况下,正常返回指定的消息,可以使用
    注意事项:statusid只能使用数字ID,不能使用现在网页版上的加密ID,否则会提示Can not view msg

    方法说明:删除指定ID的消息
    调用方法:DELETE https://rest.fanfou.com/statuses/{STATUS_ID}?oauth_token={OA2_TOKEN}
    可用参数:
    :statusid 必选 消息的ID
    测试结果:对于当前用户发送的消息也返回error: Can not delete msg,无法使用
    注意事项:statusid只能使用数字ID,不能使用现在网页版上的加密ID

    /statuses/
    方法说明:发送消息或带图消息
    调用方法:POST https://rest.fanfou.com/statuses/
    数据类型:multipart/form-data
    可用参数:
    status 必选 消息内容,如果上传图片则为可选
    location 可选 用户当前位置
    photo 可选 上传的图片数据
    测试结果:
    一直返回error: {“sendfrom”:[true]},含义不明,可能对可以发消息的OAuth2 App做了限制
    ————————————————————————————
    /account/
    ————————————————————————————
    /verify_credentials
    方法说明:验证当前用户凭据
    调用方法:GET https://rest.fanfou.com/account/verify_credentials?oauth_token={OA2_TOKEN}
    测试结果:返回error: Route rule not found,无法使用

    /profile
    方法说明:更新用户个人资料
    调用方法:PUT https://rest.fanfou.com/account/profile?oauth_token={OA2_TOKEN}
    数据类型:application/x-www-form-urlencoded
    可用参数:
    url 可选 指定用户个人网址
    location 可选 指定用户所在地,可为任何字符串
    description 可选 指定用户自述文字
    name 可选 指定用户Screen Name
    email 可选 指定用户邮箱地址
    注:以上参数至少选择一个,否则会返回411 Length Required
    测试结果:
    可以成功提交,但更新的是UID=0的账号的个人资料,等于无法使用
    ————————————————————————————
    /users/
    ————————————————————————————
    /:userid(草稿中的/show/:userid有误)
    方法说明:显示指定用户的资料
    调用方法:GET https://rest.fanfou.com/users/{USER_ID}?oauth_token={OA2_TOKEN}
    可用参数:
    :userid 必选 要查看的用户的ID,@~me代表当前登录账户
    测试结果:
    指定userid时可以正常使用,但使用@~me时返回的是UID=0的账户,此时无法正常使用

    /names/:nickname/
    方法说明:搜索指定昵称的用户
    调用方法:GET https://rest.fanfou.com/users/names/{NICKNAME}/?oauth_token
    可用参数:
    :nickname 必选 要搜索的用户昵称
    count 可选 返回结果的条数
    page 可选 返回结果的页码
    测试结果:
    与前台搜索结果有较大出入,猜测可能为新版API实行的昵称唯一化措施所致,算是可以正常使用

    /:userid/friends
    方法说明:显示指定用户关注的用户列表、显示指定用户的关注者列表
    调用方法:GET https://rest.fanfou.com/users/{USER_ID}/friends/?oauth_token={OA2_TOKEN}
    可用参数:
    :userid 必选 要查看的用户的ID,@~me代表当前登录账户
    count 可选 返回结果的条数
    page 可选 返回结果的页码
    测试结果:
    未加锁用户可以正常返回,加锁用户使用的是UID=0的用户权限,多半无法正常使用

    /:userid/followers
    方法说明:显示指定用户关注的用户列表、显示指定用户的关注者列表
    调用方法:GET https://rest.fanfou.com/users/{USER_ID}/followers/?oauth_token={OA2_TOKEN}
    可用参数:
    :userid 必选 要查看的用户的ID,@~me代表当前登录账户
    count 可选 返回结果的条数
    page 可选 返回结果的页码
    测试结果:
    未加锁用户可以正常返回,加锁用户使用的是UID=0的用户权限,多半无法正常使用

    /friendships/:userid
    方法说明:不明,猜测应为检查与对方的关注关系(我是否关注了对方)
    调用方法:GET https://rest.fanfou.com/friendships/{USER_ID}?oauth_token={OA2_TOKEN}
    测试结果:不论输入什么User ID都会直接返回该用户的资料,若实际功能与猜想一致,则该API无法正常使用

    方法说明:关注指定ID的用户
    调用方法:POST https://rest.fanfou.com/friendships/?oauth_token={OA2_TOKEN}
    数据类型:application/x-www-form-urlencoded
    可用参数:
    :userid 必选 要关注的用户ID
    测试结果:可以正常返回用户资料(关注成功)、等待验证提示(对方加锁)以及已关注提示(对方已是你的好友),
    但实际并没有加到对应Token的账户上,而是加到了UID=0的账户上,故并不能正常使用

    方法说明:取消关注指定ID的用户
    调用方法:DELETE https://rest.fanfou.com/friendships/{USER_ID}?oauth_token={OA2_TOKEN}
    可用参数:
    :userid 必选 要取消关注的用户ID
    测试结果:可以正常返回用户资料(取消关注成功)、以及未关注提示(对方还不是你的好友),
    但实际并没有对对应Token的账户进行操作,而是操作了UID=0的账户,故并不能正常使用

    /favoriates/
    方法说明:查看当前用户收藏的消息
    调用方法:GET https://rest.fanfou.com/favoraites/?oauth_token={OA2_TOKEN}
    测试结果:
    favoriates明显为拼写错误,返回route file not found,/favorites/报Method Not Allowed,无法正常使用
    实际可以正常使用的API为下文的/favorites/user_timeline/:userid/

    方法说明:向当前用户的收藏中添加消息
    调用方法:POST https://rest.fanfou.com/favorites/?oauth_token={OA2_TOKEN}
    数据类型:application/x-www-form-urlencoded
    可用参数:
    statusid 必选 要添加的消息ID
    测试结果:
    可以正常返回消息资料(收藏成功),但实际并没有加到对应Token的账户上,而是加到了UID=0的账户上,故并不能正常使用

    方法说明:从当前用户的收藏中删除消息
    调用方法:DELETE https://rest.fanfou.com/favorites/{STATUS_ID}?oauth_token={OA2_TOKEN}
    可用参数:
    statusid 必选 要删除的消息ID
    测试结果:
    可以正常返回消息资料(收藏成功),但实际并没有加到对应Token的账户上,而是加到了UID=0的账户上,故并不能正常使用

    /favorites/user_timeline/:userid/(草稿中的/favoriates/:userid/有误)
    方法说明:查看用户收藏的消息
    调用方法:GET https://rest.fanfou.com/favorites/user_timeline/:userid/?oauth_token={OA2_TOKEN}
    可用参数:
    :userid 必选 要查看的收藏的用户ID,@~me代表当前登录账户
    count 可选 返回结果的条数
    page 可选 返回结果的页码
    测试结果:
    未加锁用户可以正常返回,加锁用户使用的是UID=0的用户权限,多半无法正常使用

 

Comments

  1. 卡在 OAuth 1.0 的签名上了。搜了一下「饭否OAuth2」,看到了这篇博客。

    真希望 OAuth 2.0 的 API 是可用的啊。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

 剩余字数 ( Characters available )

Your comment will be available after auditing.
您的评论将在通过审核后显示。

Please DO NOT add any links in your comment, otherwise it would be identified as SPAM automatically and never be audited.
请不要在评论中插入任何链接,否则将被自动归类为垃圾评论,且永远不会被提交给博主进行复审。

*