Skip to content

Latest commit

 

History

History
262 lines (181 loc) · 10.6 KB

File metadata and controls

262 lines (181 loc) · 10.6 KB

Python Facebook

使用 Python 封装的 Facebook 平台下的一些数据接口

Build Status Codecov PyPI PyPI

README: English | 中文

致谢

项目的结构基于 Python-Twitter.

感谢 Python-Twitter 项目组的大佬.

安装

现在可以使用 pip 来安装这个包啦:

$pip install --upgrade python-facebook-api
✨🍰✨

由于 python-facebook 名称已经被占用,所以只能以这样的名字了。吐槽一波,好名字都被占用,并且好久都没有更新了!!

说明

该库提供一种更加简单的方式去使用 Facebook 平台的数据接口。 注意,当你使用时,由于一些原因,需要在外网环境下才可以使用。

目前包括了 Facebook, Instagram Business 产品数据的使用。

如何使用

Facebook API

Facebook API 提供了对于 Facebook 应用下的主页的相关数据的访问。核心层是 pyfacebook.Api .

在初始化 pyfacebook.Api 实例时,需要提供脸书平台的 App 的授权代码,此授权依据获取不同数据需要不同的权限。具体请参阅脸书开发文档的相关权限信息。 最基础的权限是 public_content. 可以获取主页的一些公开数据。

如果你没有相应的 App,需要在 Facebook 开发者平台下进行申请。

相关文档如下:

使用示例:

可以使用两种方式创建 Api 实例:

# 使用临时令牌和App密钥
In [1]: import pyfacebook

In [2]: api = pyfacebook.Api(app_id='your app id',   # use the second method.
   ...:                      app_secret='your app secret',
   ...:                      short_token='your short token')

# 使用长期令牌
In [3]: api = pyfacebook.Api(long_term_token='your long term access token')

初始化完毕之后可以使用该 Api 实例获取数据信息.

获取当前Token的关联信息:

In [4]: api.get_token_info(return_json=True)
Out[4]:
{'data': {'app_id': 'xxx',
'type': 'USER',
'application': 'xxx',
'data_access_expires_at': 1555231532,
'expires_at': 1553244944,
'is_valid': True,
'issued_at': 1548060944,
'scopes': ['public_profile'],
'user_id': 'xxx'}}

获取某个 Facebook 主页的公开数据信息:

In [5]: api.get_page_info(page_id='20531316728')  # 你可以指定参数 return_json 为 True, 返回 JSON 格式数据
Out[5]: Page(ID=20531316728, username=facebook)

因为脸书的图谱API的限制 Page Feed , 使用普通的 Token 只能获取大约 600 个经排名的已发布帖子。如果你想要获取到某主页的所有发布贴文,需要使用 /{page_id}/published_posts 端点。 使用此端点, 需要使用经过主页管理员授予 manage_pages 权限的主页授权 Token 。 如果你有经过授权,可以使用如下操作获取到主页访问口令:

n [6]: access_token = api.exchange_insights_token(token='user token', page_id='page id')
Out[6]: 'page access token'

获取到主页访问口令之后,就可以使用如下函数获取当前主页所发布的所有贴文:

In [7]: api.get_published_posts(username='facebook', access_token='page access token')
Out[7]: [Post...]

使用主页访问口令,你还可以获取到那些在贴文中对该主页进行标记的贴文。如下:

In [8]: api.get_tagged_posts(username='facebook', access_token='page access token')
Out[8]: [Post...]

批量获取某主页的贴文信息(不全):

In [9]: api.get_posts(username='facebook')
Out[9]:
[Post(ID=20531316728_10158033357426729, permalink_url=https://www.facebook.com/20531316728/posts/10158033357426729/),
 Post(ID=2031316728_10157806010111729, permalink_url=https://www.facebook.com/20531316728/posts/10157806010111729/),
 Post(ID=20531316728_1877006505687069, permalink_url=https://www.facebook.com/facebook/videos/1877006505687069/),
 Post(ID=20531316728_267444427196392, permalink_url=https://www.facebook.com/facebook/videos/267444427196392/)]

获取指定的某个贴文的信息:

In [10]: res = api.get_post_info(post_id='20531316728_10157619579661729')

In [11]: res
Out[11]: Post(ID=20531316728_10157619579661729, permalink_url=https://www.facebook.com/20531316728/posts/10157619579661729/)

In [12]: res.comments
Out[12]: 1016

获取某对象(贴文,图片等)的评论数据:

In [13]: res = api.get_comments(object_id='20531316728_10157619579661729', summary=True)
In [14]: res
Out[14]:
([Comment(ID=10157619579661729_10157621841846729,created_time=2018-08-16T13:01:09+0000),
  Comment(ID=10157619579661729_10157621842496729,created_time=2018-08-16T13:01:31+0000),
  Comment(ID=10157619579661729_10157621842611729,created_time=2018-08-16T13:01:34+0000),
  Comment(ID=10157619579661729_10157621842701729,created_time=2018-08-16T13:01:37+0000),
  Comment(ID=10157619579661729_10157621843186729,created_time=2018-08-16T13:01:52+0000),
  Comment(ID=10157619579661729_10157621843316729,created_time=2018-08-16T13:01:55+0000),
  Comment(ID=10157619579661729_10157621843376729,created_time=2018-08-16T13:01:58+0000),
  Comment(ID=10157619579661729_10157621843721729,created_time=2018-08-16T13:02:11+0000),
  Comment(ID=10157619579661729_10157621843771729,created_time=2018-08-16T13:02:13+0000),
  Comment(ID=10157619579661729_10157621843836729,created_time=2018-08-16T13:02:14+0000)],
 CommentSummary(order=chronological,total_count=987))
In [15]: res[1]
Out[15]: CommentSummary(order=chronological,total_count=987)
In [16]: res.as_json_string()
Out[16]: '{"can_comment": true, "order": "chronological", "total_count": 987}'

Instagram API

目前,Instagram的商家主页可以通过 Facebook 提供的 API 进行数据获取。

pyfacebook.InstagramApi 只能获取 Instagram 平台上的商家主页的数据信息。 所谓的商家主页即是 将 Instagram 账号和 Facebook 主页进行关联的 Instagram 用户。

初始化 pyfacebook.InstagramApi 实例需要提供带有 Instagram 权限的App的用户授权 Token, 以及一个 可用的 Instagram 商业账号。

详细文档请参阅:

使用示例:

Facebook Api 类似,同样可以使用两种方式初始化 InstagramApi 实例, 但需要多一个 instagram_business_id 参数:

# 使用临时令牌和App密钥
In [1]: import pyfacebook

In [2]: api = pyfacebook.InstagramApi(
   ...:     app_id = 'App ID',
   ...:     app_secret='App密钥',
   ...:     short_token='临时令牌',
   ...:     instagram_business_id='你的 Instagram 业务账号ID')

# 使用长期令牌
In [3]: api = pyfacebook.InstagramApi(
   ...:     long_term_token='your long term access token',
   ...:     instagram_business_id='你的 Instagram 业务账号ID')

获取某用户的基本信息:

In [12]: api.get_user_info(username='jaychou')
Out[12]: User(ID=17841405792603923, username=jaychou)

In [13]: api.get_user_info(username='jaychou', return_json=True)
Out[13]:
{'business_discovery': {'biography': 'https://www.facebook.com/jay/',
  'id': '17841405792603923',
  'ig_id': 5951385086,
  'followers_count': 3303887,
  'follows_count': 50,
  'media_count': 319,
  'name': 'Jay Chou 周杰倫',
  'profile_picture_url': 'https://scontent.xx.fbcdn.net/v/t51.2885-15/21147825_124638651514445_4540910313213526016_a.jpg?_nc_cat=1&_nc_ht=scontent.xx&oh=9a84c5d93df1cf7fb600d21efc87f983&oe=5CE45FFA',
  'username': 'jaychou',
  'website': 'https://youtu.be/MAjY8mCTXWk'},
  'id': '17841406338772941'}

批量获取某用户的贴文(默认获取近50条):

In [3]: api.get_medias(username='jaychou')
Out[3]:
    [Media(ID=17852512102358859, link=https://www.instagram.com/p/BuKth42Hpsm/),
     Media(ID=17914455160286660, link=https://www.instagram.com/p/BuILzrcnljS/),
     Media(ID=18038180344016282, link=https://www.instagram.com/p/BuDAlT0n0kq/),
     Media(ID=18000503476161727, link=https://www.instagram.com/p/Bt6SyHmnGyn/),
     Media(ID=17863710898325821, link=https://www.instagram.com/p/Bt49wLUnTaO/),
     Media(ID=17857272226339334, link=https://www.instagram.com/p/Bt4n5Q5ncKa/),
     Media(ID=17854413100345353, link=https://www.instagram.com/p/Bt33bRznSNo/),
     Media(ID=18033275821031206, link=https://www.instagram.com/p/Bt2bECmn0R_/),
     Media(ID=18033135562032465, link=https://www.instagram.com/p/Bt1sedfnnqD/),
     Media(ID=17933504032265945, link=https://www.instagram.com/p/BtzPPiGn2gE/),
     Media(ID=18017672368106762, link=https://www.instagram.com/p/Btt-rKqHGLH/),
     Media(ID=18033213532062450, link=https://www.instagram.com/p/BtkVolVnhXu/),
     Media(ID=18031391875036047, link=https://www.instagram.com/p/BtjkEmxH7gR/),
     Media(ID=18029417977062683, link=https://www.instagram.com/p/Btd5jPvHQUm/).....]

获取某贴文的信息(此API只可以供给当前Instagram商业账号的贴文可用, 对他人无法获取):

In [5]: api.get_media_info(media_id='17861821972334188')
Out[5]: Media(ID=17861821972334188, link=https://www.instagram.com/p/BuGD8NmF4KI/)

TODO

现在只可以通过该``API`` 获取到主页基本信息以及主页的贴文数据以及对象(帖子,图片)的评论数据。

待做:

  • Insights 数据的获取
  • 发布帖子
  • 更多....