๐Ÿ”™ Back to Top

Mon Feb 29 19:15:45 JST 2016

Twitter, ใƒ•ใ‚กใƒœใฃใŸใƒ„ใ‚คใƒผใƒˆใซไป˜ไธŽใ•ใ‚ŒใŸ็”ปๅƒใ‚’ไฟๅญ˜ใ—ใฆใƒ•ใ‚กใƒœใ‚’ๆถˆใ™

bashใงๆ›ธใ

UNIXๅ“ฒๅญฆ็š„ใซๆฌกใฎใ‚ˆใ†ใซๅˆ†้›ขใ™ใ‚‹

  1. ใƒ•ใ‚กใƒœไธ€่ฆงใฎๅ–ๅพ—
  2. ใƒ„ใ‚คใƒผใƒˆใŒๆŒใค็”ปๅƒใฎurlใฎๅ–ๅพ—
  3. ใƒ•ใ‚กใƒœใฎๅ‰Š้™ค

ใƒ•ใ‚กใƒœไธ€่ฆงใฎๅ–ๅพ—

็”จใ„ใ‚‹APIใฏ GET favorites/list | Twitter Developers. ใ“ใฎAPIใฏไพ‹ใซใ‚ˆใฃใฆใ€ๆœ€่ฟ‘ n ๅ€‹ใ ใ‘ใ‚’ๅ–ๅพ—ใ—ใฆ (ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใงn=20ใงๆœ€ๅคง200)ใ€ max_id ใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ“ใจใงใ€ใ‚ใ‚‹ใจใ“ใ‚ใ‚ˆใ‚Šๅคใ„ใ€ๆœ€่ฟ‘ n ๅ€‹ใ‚’ๅ–ๅพ—ใ™ใ‚‹ใจใ„ใ†ๅฝขใซใชใฃใฆใ‚‹.

ๆˆ‘ใ€…ใฎ็›ฎ็š„ใจใ—ใฆใฏใ€ๅ…จใฆๅ–ๅพ—ใ—ใŸใ„. ๅพ“ใฃใฆใ€ๅ…จ้ƒจๅ–ๅพ—ใงใใ‚‹ใพใงAPIใ‚’ใƒซใƒผใƒ—ใงๅฉใ็ถšใ‘ใชใ‘ใ‚Œใฐใ„ใ‘ใชใ„. ๆฌกใฎใ‚ˆใ†ใซๆ›ธใ‘ใฐใ€ๅคšๅฐ‘ใฏๅฅ‡้บ—ใซๆ›ธใ‘ใ‚‹ใจๆ€ใ†.

ไธ€็•ชๆœ€ๅˆใฏ

OPT=""
twurl /1.1/favorites/list.json?count=200${OPT}

ใจใ™ใ‚‹. APIใฏใƒ„ใ‚คใƒผใƒˆใ‚’่กจ็พใ™ใ‚‹ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ๆˆๅˆ†ใจใ™ใ‚‹้…ๅˆ—ใ‚’่ฟ”ใ™. ้…ๅˆ—ใฎๆœ€ๅพŒใฎๆˆๅˆ†ใฎ .id ใ‹ใ‚‰1ใ ใ‘ๅผ•ใ็ฎ—ใ—ใŸใฎใ‚’ใ€max_id ใจใ—ใฆๅˆฉ็”จใ™ใ‚‹ใ“ใจใงใ€ ใใฎ็ถšใใ‚’ๅ–ๅพ—ใ™ใ‚‹ใฎใซไฝฟใˆใ‚‹.

OPT="&max_id=$(( ๆœ€ๅพŒใฎใ‚„ใค.id - 1 ))"
twurl /1.1/favorites/list.json?count=200${OPT}

ใ“ใ‚Œใ‚’ใƒซใƒผใƒ—ใ™ใ‚‹. ็ต‚ไบ†ๆกไปถใฏ่ฟ”ใฃใฆใใŸ้…ๅˆ—ใŒ็ฉบใงใ‚ใ‚‹ใ“ใจ.

ใƒ•ใ‚กใƒœไธ€่ฆงใจใ„ใ†ใ‘ใ‚Œใฉใ€ไฝ•ใ‚’ๅ–ๅพ—ใ™ใ‚Œใฐๆœ€ๅฐ้™ๅบฆๅๅˆ†ใชๆƒ…ๅ ฑใ‹.

ๅ‰ใ‹ใ‚‰็–‘ๅ•ใงใ‚ใฃใŸใŒใ€ max_id ใซๆŒ‡ๅฎšใ—ใŸidไปฅไธ‹ใฎใ‚‚ใฎใŒๆฅใ‚‹ใฏใšใงใ‚ใ‚‹ใŒใ€ๅถใซๅฐ‘ใ—ๅคงใใ„ใฎใ‚‚ๆฅใ‚‹. ใ‚ใจใง้‡่ค‡ใ‚’ๅ–ใ‚Š้™คใๅฟ…่ฆใŒๅœจใ‚‹.

GET statuses/show/:id | Twitter Developers ใฃใฆใ„ใ†APIใ‚’่ฆ‹ใ‚‹ใจใ€ ใƒ„ใ‚คใƒผใƒˆใฎ id (https://twitter.com/:screen_name/status/:id ใฎ :id) ใ ใ‘ใ‚ใ‚Œใฐๅๅˆ†ใ‚‰ใ—ใ„.

ใพใŸใ€APIใฏ .id ใจใ€ใใ‚Œใ‚’ใŸใ ๆ–‡ๅญ—ๅˆ—ใซใ—ใŸใ ใ‘ใฎ .id_str ใ‚‚ไธ€็ท’ใซๆธกใ™ใฎใŒ้€šไพ‹ใซใชใฃใฆใ„ใ‚‹. .id ใฏๆ•ดๆ•ฐใงใ‚ใ‚‹ใŒ int32 ใงใฏๅˆฐๅบ•ๅŽใพใ‚Šใใ‚‰ใšใ€jq ใฏๅฎŸใฏๆญปใฌ.

   echo '{"x":111111111111111111111}' | jq .
{
  "x": 111111111111111110000
}

ใพใŸ bash (zsh) ใฎ $(( )) ใซใ‚ˆใ‚‹ๆ•ดๆ•ฐๆผ”็ฎ—ใ‚‚ๅŒๆง˜ใฎ็†็”ฑใ‹ใ‚‰ไฟก็”จใงใใชใ„. ใใฎใŸใ‚ใซใ€ .id_str ใŒใ‚ใ‚‹ใ‚ใ‘ใงใ€ใ“ใ‚Œใ‚’ใ‚ฝใƒผใ‚นใซใ—ใฆไฟก็”จใงใใ‚‹ใƒ—ใƒญใ‚ปใƒƒใ‚ตใƒผใฎใฟใ‚’็”จใ„ใ‚‹.

ๆ–‡ๅญ—ๅˆ—ใ‚’ๅใใจใใ€ใƒ€ใƒ–ใƒซใ‚ฏใ‚ชใƒผใƒ†ใƒผใ‚ทใƒงใƒณใงๆ‹ฌใ‚ใ†ใจใ™ใ‚‹ใฎใง -r ใ‚ชใƒ—ใ‚ทใƒงใƒณใงใใ‚Œใ‚’ๆŠ‘ๆญขใ™ใ‚‹.

ใจใ„ใ†ใ‚ใ‘ใงใ“ใ‚“ใชใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’ tw-fav-list ใจใ—ใฆใŠใ.

#!/bin/bash

TMP=$(mktemp)
OPT=""

while :; do
    URL="/1.1/favorites/list.json?count=200${OPT}"
    twurl "$URL" | jq -r '.[].id_str' > "$TMP"
    if [ ! -s "$TMP" ]; then
        break
    else
        NEXTID=$(ruby -e "p $(tail -1 "$TMP") - 1")
        OPT="&max_id=${NEXTID}"
        cat "$TMP"
    fi
done | sort -ur

rm "$TMP"

ใƒ„ใ‚คใƒผใƒˆใŒๆŒใค็”ปๅƒใฎurlใฎๅ–ๅพ—

https://twitter.com/ily_ilyhk2/status/703932013493915648 ใŒๆŒใค็”ปๅƒใ‚’ๅ–ๅพ—ใ—ใฆใฟใ‚‹. 1ใƒ„ใ‚คใƒผใƒˆใŒ่ค‡ๆ•ฐๆžšๆŒใคใ“ใจใŒใ‚ใ‚‹.

ๅ–ใ‚Šๅ‡บใ™ในใใฃใฝใ„ๆ–‡ๅญ—ๅˆ—ใฏใใ“ใซใ‚ใ‚‹ใฎใงใ€

twurl /1.1/statuses/show.json?id=703932013493915648 | jq -r '.extended_entities.media[].media_url_https'

ใจใ™ใ‚Œใฐใ‚ˆใ„.

ๆฌกใ‚’ tw-media-list ใจใ—ใ‚ˆใ†.

#!/bin/bash

twurl /1.1/statuses/show.json?id=$1 | jq -r '.extended_entities.media[].media_url_https'

ใƒ•ใ‚กใƒœใฎๅ‰Š้™ค

ใ“ใ‚ŒใฏใŸใ APIใ‚’ๅฉใใ ใ‘.

ๆฌกใ‚’ tw-unfav ใจใ™ใ‚‹.

#!/bin/bash

twurl -X POST /1.1/favorites/destroy.json -d id=$1

ใพใจใ‚

tw-fav-list > fav-list.txt
for id in `cat fav-list.txt`; do tw-media-list $id; done | tee media-list.txt
wget -i media-list.txt
for id in `cat fav-list.txt`; do tw-unfav $id; done

ๅ‹•็”ป (webpๅฝขๅผใ ใฃใŸใ‹ใช) ใฏใ€ใ“ใ‚Œใ ใจใ‚ตใƒ ใƒใ‚คใƒซ (jpg) ใŒๅพ—ใ‚‰ใ‚Œใ‚‹ใฝใ„