CSV에 TwitterAPI 데이터 내보내기

27097 단어 Node.jsTwitter APItech
안녕하세요.네.
당신을 도와 PARKLoT하는 서비스가 있습니다.
트위터 API로 함수를 쓸 기회가 있기 때문에 거기서 얻은 지식과 실현과정을 소개하고 싶다.
https://id.park-lot.com/

창설했어


트위터 API를 두드려'트위터 홍보'를 하는 트윗을 얻어 CSV로 출력하는 도구를 만들었다.
트위터 활동은 다음과 같은 트위터를 말한다.

실현된 요구


이런 트윗을 취득하기 위해서는 기업 등이 진행하는 캔펜 트윗만 취득하면 된다.
Canpen 트위터에는 이 같은 트위터 외에도 지원자의 "홍보 이벤트에 응모했다!"이런 트윗과 회신 가능성이 있다.
이런 트윗 외에 순수한 캔펜 트윗만 얻어야 한다.

실현 과정


조건에 맞는 기능을 구현하기 위해 먼저 트위터에 캔버스 트위터를 검색해 "어떤 캔버스 트위터가 있을까요?"'Canpen 트위터의 공통점이 무엇인가'를 고민하면서 스프레드시트에 수십 개 정도 써봤다.
그렇게 하는 과정에서 다음과 같은 공통점을 볼 수 있다.
  • "캠페인", "추적", "개최", "RT"등의 용어 포함
  • RT 일정 수량 포함, 괜찮은 값
  • 프로모션 사이트에 대한 링크 또는 이미지 포함
  • 이 조건에서 실현된 조건은 다음과 같다.
  • '홍보활동','추적'등의 용어 포함
  • 좋은 수량 30 이상, RT100 이상
  • 이미지 또는 링크 포함
  • 이 조건은 실제 서비스를 개발하고 운용하는 과정에서 개선될 것이다.
    TwitterAPI를 사용하여 조건을 포함하려면 질의에 를 입력합니다.キャンペーン フォロー min_faves:30 min_retweets:100 (filter:images OR filter:link)이룰 수 있을 거예요.
    참조: https://gist.github.com/cucmberium/e687e88565b6a9ca7039

    Twitter API를 사용한 구현


    나는 트위터 API를 두드리기 위해 프로그램 라이브러리를 이용했다.
    트위터 API에서 트윗을 가져와 CSV로 출력하여 유효성을 검사하는 함수를 구현합니다.

    Twitter API 권한 얻기 및 Client 만들기


    트위터 API의 계정 신청은 실제로 이뤄지지는 않았지만, 다음 절차에 따라 계정 신청이 이뤄진다.
    가져온 API 키를 사용하여 클라이언트를 생성합니다.
    dotenv 등의 API 키를 사용합니다.env 파일로 관리합니다.
    require('dotenv').config()
    const Twitter = require('twitter')
    
    const client = new Twitter({
      consumer_key: `${process.env.TWITTER_CONSUMER_KEY}`,
      consumer_secret: `${process.env.TWITTER_CONSUMER_SECRET}`,
      access_token_key: `${process.env.TWITTER_ACCESS_TOKEN_KEY}`,
      access_token_secret: `${process.env.TWITTER_ACCESS_TOKEN_SECRE}`
    })
    

    데이터 추가


    가져온 데이터를 그룹에 추가합니다.
    나는 아래 페이지를 참고하여 설치를 진행하였다.
    client.get을 통해 트위터를 가져옵니다.
    매개변수(endpoint, params, 데이터)를 지정합니다.
    const data = []
    
    async function searchTweet(count) {
      await client.get('search/tweets', {
        q: `キャンペーン フォロー min_faves:30 min_retweets:100 (filter:images OR filter:link)`,
        count: count,
        tweet_mode: 'extended'
      }, (error, searchData) => {
        if(error) {
          console.log("キャンペーンのツイート取得に失敗しました。")
          console.error(error)
          return error
        }
        searchData.statuses.forEach(tweet => {
          data.push({
            id: tweet.id,
            name: tweet.user.name,
            screen_name: tweet.user.screen_name,
            image_url: tweet.user.profile_image_url,
            created_at: tweet.created_at,
            text: tweet.full_text.replace(/\r?\n/g, ""),
            favorite_count: tweet.favorite_count,
            retweet_count: tweet.retweet_count
          })
        })
      })
    }
    
    searchTweet(100)
    
    주의사항은 트위터 텍스트를 가져오는 것이다.
    표준은 검색 데이터입니다.statuses에text라는 값이 있습니다.
    그러나 기본적으로 이 트위터의 내용은 전문이 아닌 생략됐다.
    따라서 설정tweet_mode: 'extended', 취득full_text.
    그리고text에 줄 바꿈 문자가 포함되어 있어 데이터를 CSV 등에 넣을 때 일치성을 얻지 못합니다.
    여기서 tweet.full_text.replace(/\r?\n/g, "")처럼 실시하면 줄 번호가 바뀌지 않습니다.
    참조: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace

    CSV에 데이터 추가


    이번에는 CSV에 데이터를 쓰기 위해 csv-writer라는 프로그램 라이브러리를 사용했습니다.
    https://www.npmjs.com/package/csv-writer
    실현은 다음과 같다.
    require('dotenv').config()
    const Twitter = require('twitter')
    const createCsvWriter = require('csv-writer').createObjectCsvWriter;
    
    const client = new Twitter({
      consumer_key: `${process.env.TWITTER_CONSUMER_KEY}`,
      consumer_secret: `${process.env.TWITTER_CONSUMER_SECRET}`,
      access_token_key: `${process.env.TWITTER_ACCESS_TOKEN_KEY}`,
      access_token_secret: `${process.env.TWITTER_ACCESS_TOKEN_SECRE}`
    })
    
    const csvWriter = createCsvWriter({
      path: 'out.csv',
      header: [
        {id: 'id', title: 'ID'},
        {id: 'name', title: 'Name'},
        {id: 'screen_name', title: 'Screenname'},
        {id: 'image_url', title: 'Image'},
        {id: 'created_at', title: 'Created_at'},
        {id: 'text', title: 'Text'},
        {id: 'favorite_count', title: 'favorite_count'},
        {id: 'retweet_count', title: 'retweet_count'},
      ]
    });
    
    const data = []
    
    async function searchTweet(count) {
      await client.get('search/tweets', {
        q: `キャンペーン フォロー min_faves:30 min_retweets:100 (filter:images OR filter:link)`,
        count: count,
        tweet_mode: 'extended'
      }, (error, searchData) => {
        if(error) {
          console.log("キャンペーンの一覧取得に失敗しました。")
          console.error(error)
          return error
        }
       searchData.statuses.forEach(tweet => {
          data.push({
            id: tweet.id,
            name: tweet.user.name,
            screen_name: tweet.user.screen_name,
            image_url: tweet.user.profile_image_url,
            created_at: tweet.created_at,
            text: tweet.full_text.replace(/\r?\n/g, ""),
            favorite_count: tweet.favorite_count,
            retweet_count: tweet.retweet_count
          })
        })
        // CSVに出力
        csvWriter
          .writeRecords(data)
          .then(()=> console.log('The CSV file was written successfully'))
        },
      );
    }
    
    
    searchTweet(100)
    
    이렇게 디렉터리에 생성out.csv되었으니 참조할 수 있습니다!
    ID,Name,Screenname,Image,Created_at,Text,favorite_count,retweet_count
    1373288469963755500,【公式】ポイ活ならワラウ(warau),warau_official,http://pbs.twimg.com/profile_images/1275338413768536064/SPKPHpwm_normal.png,Sat Mar 20 15:01:00 +0000 2021,/大吉を当てろ🎊おみくじキャンペーン🎉\大吉のおみくじを選んだ人の中から、抽選で毎日3名様にAmazonギフト券「500円分」を #プレゼント🎁7日連続 #キャンペーン の「1日目」▼参加方法1.フォロー&RT2.画像からおみくじを1個選んで本投稿にコメント■期限3/21(日)迄 #ポイ活 #懸賞 https://t.co/dsgQdYqXx4,125,556
    1373288251130253300,Qoo10,Qoo10_Shopping,http://pbs.twimg.com/profile_images/1249926973016526848/yrxqGqnZ_normal.jpg,Sat Mar 20 15:00:08 +0000 2021,\\TIRTIRプレゼントキャンペーン最終日スタート//ベッキョンのサイン入り商品が10名様に当たる👏マスクフィットクッション SPF50+PA+++とサインを合わせてプレゼント🎁■応募方法①Qoo10公式アカウントをフォロー②この投稿をRT🔄③リプライをチェック🔔#TIRTIR #Qoo10 https://t.co/6WHgqLwp7I,552,3240
    1373288242162765800,コリュパ!《交流/交友/交遊》イベント情報サイト,koryupa,http://pbs.twimg.com/profile_images/1332880618410000384/QbNd7hzD_normal.jpg,Sat Mar 20 15:00:06 +0000 2021,コリュパ【フォロー&RT #キャンペーン 】1名様にamazonギフト券《5000円分》プレゼント🎊3月号:7日目🎊\毎日RTで当選確率UP/1️⃣@koryupaをフォロー2️⃣この投稿をRT🤤<出産したらお寿司をたらふく食べたいです🍣特にイクラが好きです✨▼詳細https://t.co/W0NL4wlKpW https://t.co/oCDbSPNP97,208,987
    1373288228149624800,うまさにいちず みやぎ米,miyagimaija,http://pbs.twimg.com/profile_images/1545162362/twitter_ico_normal.jpg,Sat Mar 20 15:00:02 +0000 2021,\その場で当たるキャンペーン実施中!/ 期間中99名に #みやぎ米 2kgと買物バッグセットがその場で当たる🍚外れても1名に人気家電が当たるチャンス 🎁ご飯は、みやぎ米できまり!①@miyagimaijaをフォロー②このツイートを3/21 23:59までにRT③結果が自動返信で届く!(家電当選者は後日通知) https://t.co/5jagzXzdJA,426,2658
    1373288221916852200,別冊少年マガジン【公式】,BETSUMAGAnews,http://pbs.twimg.com/profile_images/709387261897342978/3DvyjBK2_normal.jpg,Sat Mar 20 15:00:01 +0000 2021,『 #進撃の巨人 』終了直前!!4/9の最終話までカウントダウン!5週連続フォロー&RTキャンペーン開催!『進撃の巨人』特製QUOカードが毎週3名様に当たる!1⃣フォロー2⃣このツイートをRT3週目:3/27(土)23:59まで詳細はhttps://t.co/sAqMFSqRfW#進撃の巨人最終話直前 #プレゼントCP https://t.co/RuFObR9zsX,693,1936
    <!-- 以下省略 100件取得される -->
    

    총결산


    사실상 팀 개발은 처음이다.
    심플한 실크룩이지만 팀이 조건을 확인하면서 진행한 개발이 즐거웠다.
    앞으로도 공구 개선과 개발을 계속 추진하겠다.
    추기: 속편을 썼기 때문에 이쪽도 꼭 봐야 한다
    ParkLot(공원 로트)
    https://id.park-lot.com/

    참고 문장


    https://gist.github.com/cucmberium/e687e88565b6a9ca7039
    https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace
    https://www.npmjs.com/package/csv-writer

    좋은 웹페이지 즐겨찾기