politwoops.tw 進度規劃現況

最後編輯:2014-10-07 建立:2014-07-15 歷史紀錄

LANFON這是 watchOut x g0v summer code project.

後端 fork from https://github.com/sunlightlabs/politwoops-tweet-collector

前端 fork from https://github.com/sunlightlabs/politwoops

後端是主要進度。

github repo: feepytwpolitwoops-collector

    lanfon先 fork fb-sdk 下來改
    lanfon

    LANFON預計進度

  1. LANFON把 politwoops.tw 整個架起來
  2. 建後端的 collector
  3. 做資料測試
  4. 修 mockup and web 介面

 

    LANFON進度現況

LANFONThe 2nd part.

  • 做個簡單的 web 介面 to show data.
  • 實做 screenshot-worker 功能
  • 建前端 ( politwoops' rails )
  • additional: 部會的新聞稿 RSS collector.
    • lanfonRef: http://logbot.g0v.tw/channel/g0v.tw/2014-08-21#18

 

    lanfon預計希望星期一(8/18)可以 checker 生出來,這樣可以留星期二做 ppt...
    lanfon星期三應該可以早點到草辦(?) 討論一下第二階段的核心重點囧...
    lanfon發現寫日誌↓太痛苦了只好放棄QAQ
      lanfon8/7 建了專用帳號林艸艸,把公督盟的立委 FB、專頁 資訊都 follow 完成並取得 uid.
      lanfon8/6 先把 feed_stream 套回 -client, 並修正 -work, 讓 -client 讀到的資料可以被 -work 存取。

 

待解 issues:

**改記錄在github上。

(以下廢棄-_-)

  • Client
    • FB access_token expire
    • 增加其他政治人物資料(eg. 市長) in 市長候選人
    • streaming.py 的 access exception handle. ( set retry )
    • access_token extend, should rewrite into .ini
    • retry time should be slowly
      • lanfon先改成 30s
    • exceed rate call.
      • lanfonerror #613 , request 太頻繁的樣子 囧rz...
        lanfonre-request 改成 90s... 但還是會 err 613 (sometimes)
  • Worker

 

  • Checker
    • check feed should separate by time.
      • lanfon這個要先解... api 限制 600 calls / 600 seconds,所以要均分 10 mins 下來的總 calls 數量。
        lanfon(( 可能的解法也許是壓下 per check tick 的 feeds 數量, 壓在 500 feeds/ 600secs 以下,留 100 calls 給 streaming request
        lanfon避免超額的問題,先改成 check today feeds only. (8/31)
        lanfon解法B: 額外建一個 api 專門拿來 check 用,不用和 client share calls/secs ((但上限仍然為 60

...*deleted_feeds 判斷有誤

    lanfonmight fixed.
  • 當掉不會跳出...囧
  • deleted_feeds 有少...(可能是cursor.execute太快 lol...)
    • lanfondeleted_feeds的問題猜測是 CPU 速度 > I/O... 先用 sleep a tick 測看看
      lanfonsolved.

 

  • Database
    • tables redesign
      • lanfon↓ redisign 的重點, politicians 和 politwoops 所用的 tables 重複
      • feeds
      • deleted_feeds
      • politicians
        • lanfon↓新產生的 tables, 應該是不需要 redesign
      • normal_users: id(PK, auto), user_name, facebook_id, ignored
      • tmp_feeds:id(PK, feed's id), user_id, user_name, content, created, modified, feed, feed_type
      • parties:id(PK, auto), name, created_at, updated_at, display_name
      • offices:id(PK, auto), title, abbreviation
        • lanfon↓「應該」不會用到的原 politwoops tables
      • pages:id(PK, auto), title, slug, content, created_at, updated_at, language
      • statistics: id(PK, auto), what, when, amount, created_at, updated_at
      • account_links:id(PK, auto), politician_id, link_id, created_at, updated_at
      • account_types:id(PK, auto), name
      • schema_migrations:version
      • users
        • lanfonusers 應該是前端用的, 就不列出來了
          lanfon↓確定不會使用的 tables
      • tweet_images:id(PK, auto), url, tweet_id, created_at, updated_at
      • deleted_tweets:id, user_name, content, deleted, created, modified, tweet, politician_id, approved, reviewed, reviewed_at, review_message, retweeted_id, retweeted_content, retweeted_user_name
        • lanfon原本應該有一個 tweets 的 table, 但被我改名成 feeds 了XD... 格式和 deleted_tweets 類似
    • SQL table fields
      • politicians
      • tweets → feeds
      • deleted_tweets → deleted_feeds
      • edited_feeds
      • normal_users
      • tmp_feeds
    • deleted feed stream checker
    • edited feed stream

---

comments: order by desc.

  • 不確定啥用的tables: users, account_links, offices, pages, statistics
  • parties應該是政黨(party)的資料,tweet_images 是圖檔的儲存資料,schema_migrations 應該是tables versions(?
  • feed be deleted 的驗證蠻卡的... 一般的 like post, comment post 沒辦法從 api 取得,
  • 和實際被刪除的 feed 一樣會被 api return error.
  • edited_feeds 需新增(但大量更新感覺資料會非常多...囧
  • edited_feeds 改存在 feeds 的 feed_edited column.
  • edited_feed stream 和 deleted feed stream, -worker 併在一起了。
  • feed_edited 的做法寫在 talks #2.
  • normal_users:
  • 存一些 " found user id not in politicians " 的「一般人」或是原本取得的 politician uid 是錯的,也會先丟進這裡。had a column: ignored (被確認為一般人)
  • tmp_feeds:
  • 1. normal_users' feed but not be ignore.
  • 2. deleted_feeds 的暫存
  • 3. 其他(總之先暫存=_=
  • feeds_checker:
  • 目前的 idea 是每 3~5 mins 從 feeds 裡面用 id 一個一個讀(避免用 feed stream 有可能會漏掉的問題
  • 但有個問題是「讀不到不見得被刪掉」=_=

 

 

=========分水嶺==========

  • politwoops 整個架起來(後端) #1
  • 建後端的 collector //screenshot-worker 先 pass 了, so finished at week: 7/13~
    • 把 collector 主要在跑的三支 .py 看懂
      • tweets-client.py
        • 主要進入點在 Line:158,跑兩個thread當heartbeat用(一個避免當掉),在stream_forever 裡會跑 tweepy 的 stream listener ( L:150&151)
        • 核心的結構應該算是 L:60 的 class ,把 tweepy 讀到的資料 put 進 beanstalkc ,然後 alert 。 (接下來就沒它的事了XD)
      • politwoops-worker.py
        • 主要進入點在 Line:105,監測 beanstalk 有沒有 job ( put from tweets-client ),再做處理(L:121)。
      • screenshot-worker.py
        • lanfon這支主要是跑截圖, ly 說先不管它XD
          Yuan Hsiang Chengya 這個前面完成再來做
    • Write a api like tweepy's on_data() //finish at week: 7/20~
      • GraphAPI可以讀到:
        • 自己的 wall post 出現的內容
          • 讀自己的 wall post 比較近似 tweepy 的 streamListener
        • 特定使用者(by id)的 feeds
          • 粉絲頁的 id 可以從 data-uid 取得,但 user 的 data-id 卻不見得能夠被 api 讀取( 從chrome-> F12-> data-id )
            • lanfon後來發現這是 v2.0 api 的問題=___= 剛改成 unversioned 就可以從 data-uid 抓到 feeds 了
              lanfon=_= (((但我用自己的 data-uid 測還是不行....
              lanfon這真的超詭異的... https://graph.facebook.com/{data-uid}/ 可以讀到資料,但/feed?access_token 卻 OAuth deny...
      • API 的選擇(既然要做得像 tweepy 就叫 feepy 了(X))
        • write like tweepy streamListener
          • 只負責讀自己的home feeds (這樣得開一個新的帳號去 follow & like politicians )
          • 好處是如果被 politicians add friend 的話可以爬到 friend 級的 feed (沒被限制的話
          • 壞處是 feeds 的排序...一般在看的時候可以選 top stories / most recent ,從 fb-sdk 抓下來的 data 不知道是怎麼排的。(而且資料一多的話 listener 有可能漏掉
        • a politician have a listener
          • 個別監聽(?)比較不會有漏訊息的問題,但 deleted feed 似乎還是無解...目前想到的做法是用 feed url 是不是導向 404 的方式去抓(但感覺頗有點難QAQ)
          • uid 不易取得。而且有些 user 就算抓到了 uid ,feeds 的資料還是空的...(不知道是不是版本的問題)
    lanfonsource code: feepy/facebook/streaming.py
  • 目前的 usage:
  • import facebook & streaming #還沒寫成module檔所以...XD
  • token = '(your access_token)'
  • listener = streaming.StreamListener() #politwoops 在 listener 的部份是 overriding
  • stream = streaming.Stream( token, listener)
  • stream.filter() #and it get run.
    lanfonproblems:
    lanfon1. exception 沒有全抓到, 有時候會 response error ( 目前是用vm測長掛,有可能是節電功能的關係XD
    lanfon2. filter() 有一些參數沒寫完 (預計是要拿來做 edited & deleted 的功能, 這部份會再補上)
    lanfon3. token expired 的問題 ( expired 的問題不知道何解.... 查到的大部份都是解決app's token expired, 但如果用 app 的 token 抓不到自己的 wall post. ( /v2.0/me/home/ can't request)
    lanfon 這部份算是 fb & twitter api 的差異, twitter 有 customer_id & secret, 但 fb 找不到 customer_id & secret....=_=
    • Stream 功能完善化 // expect finish: 7/28~
      • edited feed, add key('edited')
        • lanfonly 說這部份可以參考 news-diff
          lanfon用 async stream 實做,primary stream 1min to req ; secodary stream 5min req, to check updated_time != created_time
      • deleted feed
        • lanfon這部份可能得跳過囧...
          lanfon後來決定改第二支 -worker 的 handle_deletion。原本的刪除(因為沒 deleted key),改成讀 feeds table 再對 FB api 做個別查詢,去驗證 feed exist or not.
    • 套回 collector 做測試 // expect finish: 8/3~
      • lanfonnot here, (上週把 stream 完善一半就....跑去幫忙81了QQ)
        lanfon目前打算直接把 -worker & -client rewrite 之後讓它跑看看, 原 collector repo 已 fork.

 

    LANFON備註 & 討論

  • LANFONtweepy github
    • lanfon核心的 library 是 tweepy 跟 beanstalk ,但 beanstalk 主要是處理資料流,最大的問題還是在 tweepy 上。
      lanfon我有跑去看了一下 tweepy 的 source code ,不太確定它 streaming.listener 讀的資料是在自己的 twitter 牆上? 沒啥在用 twitter 不太理解它的運作方式....囧。
      lanfon假想的情況是, api 是 listener 自己的 twitter 牆 ( twitter 是在每個 following tweet 的時候都會一併出現在 follower 的牆上吧? ),再針對 tweet 做判讀( tweet content ),所以在 on_data 的時候可以直接從 data.has_key() 裡面判斷資料.....
      lanfon但現在比較實質的問題是 FB 的 api 沒有 delete 的 status, 提供的 library 也不全(昨天的 FB-pysdk 也沒有類似像 tweepy 的 api 囧,目前的情況比較可能得自幹類似的功能QQ
    Yuan Hsiang Chenghttps://developers.facebook.com/docs/public_feed
    Yuan Hsiang Cheng這裡有提到facebook posts要不要參考一下?
    lanfontweets-client 的資料來源是 tweepy 的 on_data funciton (讀 twitter 牆面的資料),目前找到可用的 FB Python api 只有 faceboook-sdk ...fbsdk 從 GraphAPI 讀到 FB 牆面的資料( dict 格式, keys: data, paging ),但每次讀到的資料不確定一不一樣 囧
      lanfonpaging 內的 previous & next 回傳的是 url (帶 accesstoken )
      lanfondata 內是 list feeds,再根據每筆 feed 會有不同的 keys() 示意圖↓
      lanfon
  • FB API 問題
    lanfonpost ref: https://developers.facebook.com/docs/graph-api/reference/v2.0/post/
    lanfon沒有提供 edit history 可以讀
    lanfon沒有提供 deleted feed 可以讀 QAQ!! (↓ 參考
    lanfon
    lanfonfeed's uni link 可以在 actions: 裡面找到 ( comment & like )。 ( for deleted)
    lanfon周倪安這篇改了四次,但在抓下來的資料裡面只有 create_time 跟 updated_time 能看出明顯的差異... (for edited)
  • FB api 可以用 since, until (Unix timestamp格式)去抓時間區間的feeds,但這只限於created_time。
    • lanfonupdated_time 可能還是得一個一個比對...=_= post feed 感覺就是免洗啊 囧...

API差異

  • twitter
    • 沒有 edit 功能
    • API有提供轉推(retweet)的資訊
      • lanfon"retweet_status' = False || { entities }
  • Facebook
    • 有edit 功能,但 API 不提供比對
      • lanfon本來打算用 updated_time 做 compare, 但原 feed 就算內容沒變,有人 like or comment 也會更新 updated_time...
    • 沒有獨立提供 shared via 的資訊
      • lanfon但可用 feed 內的 type, status_type, link 做比對(通常是 shared_story + [type] + link
  • all feed keys: id, from, actions, type, privacy, created_time, updated_time, status_type, shares, likes, comments, picture, message, link, application, name, properties, object_id, place, caption, description, story, icon, source
  • must have's feed keys: id, from, actions, type, privacy, created_time, updated_time
  • type = ['status', 'link', 'video', 'photo']
  • status_type = ['mobile_status_update', 'created_note', 'added_photos', 'added_video', 'shared_story', 'created_group', 'created_event', 'wall_post', 'app_created_story', 'published_story', 'tagged_in_photo', 'approved_friend']

 

    LANFONtalks

    lanfon依目前 (7/15) 看 code 的狀況, 2 & 3 應該會混在一起做;如果有類似 tweepy 的 FB library 則應該會在 8 月初前完成,沒有的話可能得自幹類似 tweepy 的 library.... 那在 8/20 前會完成 ( 後端能做 demo
    Yuan Hsiang Cheng那這禮拜的進度就是先玩一下facebook oauth 和facebook api?
    lanfon玩 fb api ing LOL
    Yuan Hsiang Cheng應該要申請一個faebook app,拿到app id跟app key之後,在app裡面填上去,根據facebook 的oauth流程,可以拿到user的access token,不過public posts應該不用這樣? XD
    lanfon我先從 graph API Explorer 做測試XD 但我的牆實在是太髒了lol...感覺要申請一個空帳號來抓會比較好明白會出哪些data
    Yuan Hsiang Chengya, 申請一個空帳號,另外也可以看能不能抓到某個政治人物facebook的public posts
    Yuan Hsiang Chenghttps://developers.facebook.com/docs/public_feed 另外這邊好像有ˋ提到delete的東西參考一下
    lanfon! ok我去研究看看XD

LANFON#1

    lanfon測試用的機器是跑 Lubuntu 12 & 14,
    lanfondependencies 包括: git, python, pip, pythonsqldb, mysql, beanstalkd, tweepy(新版) 跟原project requirements 內的python相關套件。
    lanfonpip在 lubuntu 下要用 easy_install 安裝,直接用 apt-get 到後面會炸掉...(原因不明)
    lanfon照 README.md 跑到 Running 前, config 檔寫好之後 create database,資料表的部份因為相依在前端的project,這邊先用 ly提供的 sql schema ,倒進 databse 。
    lanfon切進 politicians tables, 加入測試用的 twitter_id & infos.
    lanfon跑 Running. (( 第三支截圖用的不跑,config中用 # 把 [AWS] 下的設定都註解掉

#2

    lanfonDO 機器是 Ubuntu 12.04(LTS)
    lanfonfeeds 可以抓到一些很奇妙的東西....像是某擬參選人去open groups like post, comment 別人的 post 之類的....(但用 api 沒辦法直接抓到那則post 的 feed)
    lanfon為了避免漏抓 feed, streaming 改成 now() - 10min. ((也就是說 -client start 的時候會先讀前 10分鐘的內容
    lanfon這樣子的好處是, streaming 的間隔是 1min (目前),每次 on_data() 的情況都會是前 10分鐘~現在,feed 如果存在的話就會被抓到10次。 ((剛好可以拿來 check edited.
    lanfon((↑↑↑↑不知為何覺得寫得好像有點難懂XDDDD 想到要做 ppt 可能要畫圖就覺得有點痛苦 囧...
    lanfon另外因為 deleted_feed 也會對存在 feeds table 裡面的 feed 做 check, 所以剛好可以解決 feed be edited 的問題(時間差)。