Day 2821 饭否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的用户权限,多半无法正常使用

 

注:所有评论将在审核通过后显示,请不要在评论内容的任何位置出现链接,否则您的评论将被自动移入回收站,且永远不会被复审。

All comments will be available after being manually reviewed, please do not include any links anywhere in your comment, otherwise your comment will be automatically deleted and are not eligible for review.

3 条评论

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

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

发表回复

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