LoginSignup
2
1

More than 3 years have passed since last update.

この記事をいいねしたユーザの投稿記事タイムラインを自動更新する記事を作成してみた

Last updated at Posted at 2019-07-31

TL;DR

(注意) 本記事を「いいね」すると、いいねしたユーザの投稿した記事に、投稿後一定期間、本記事からリンクが作成されます。本記事で何がしたいのかは作成者も不明

この記事を自動更新するためのコード(node.js)

下記のコードをcronにて、毎朝11時55分に実行されるように設定しています。

thisRankingCreate.js
const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = (authorization_token) => {
  const request = require('request');

  const ITEM_ID = '1f23349c2521d916ed1a'
  const GET_LIKE_REQUEST_MAX = 10; // この記事につく「いいね」は1,000を超えないだろう。
  const GET_ITEM_REQUEST_MAX = 30; // 直近、3,000記事が対象

  const execRequest = (url, method, json) => {
    return new Promise( (resolve, reject) => {
      let request_arg = { url: url, headers: { Authorization: authorization_token } };
      if (method) request_arg.method = method; 
      if (json) {
        request_arg.json = json;
        request_arg.headers['Content-Type'] = 'application/json';
      }
      request(request_arg, (error, response, body) => {
        if (error) {
          console.log(`execRequest fail [${url}]`);
          reject(error);
        } else {
          console.log(`execRequest success [${url}}]`);
          if (method) console.log(body);
          resolve(method ? body : JSON.parse(body));
        }
      });
    });
  } 

  (async () => {
    let users = [];
    for(let i = 1; i <= GET_LIKE_REQUEST_MAX; i++) {
      let response_likes = await execRequest(`https://qiita.com/api/v2/items/${ITEM_ID}/likes?page=${i}&per_page=100`);
      response_likes.forEach( like => {
        users.push(like.user.id);
      });
      if (response_likes.length < 100 || response_likes.length === 0) break;
    }
    let items = [];
    for(let i = 1; i <= GET_ITEM_REQUEST_MAX; i++) {
      let response_items = await execRequest(`https://qiita.com/api/v2/items/?page=${i}&per_page=100`);
      response_items.forEach( item => {
        if (users.indexOf(item.user.id) !== -1) {
          let jDate = new Date(item.created_at);
          items.push(`##### [${item.title}](${item.url}) by ${item.user.id} ${jDate.getFullYear()}/${('0' + (jDate.getMonth() + 1) ).slice(-2)}/${('0' + jDate.getDate() ).slice(-2)} ${('0' + jDate.getHours() ).slice(-2)}:${('0' + jDate.getMinutes() ).slice(-2)}:${('0' + jDate.getSeconds() ).slice(-2)}`);
        }
      });
      if (response_items.length < 100 || response_items.length === 0) break;
    }

    let body = `
# TL;DR

**(注意) 本記事を「いいね」すると、いいねしたユーザの投稿した記事に、投稿後一定期間、本記事からリンクが作成されます。**~~本記事で何がしたいのかは作成者も不明~~

<details><summary>この記事を自動更新するためのコード(node.js)</summary><div>

下記のコードをcronにて、毎朝11時55分に実行されるように設定しています。

\`\`\`  javascript:thisRankingCreate.js
const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = ${thisCode.toString()}
thisCode(authorization_token);
\`\`\`

</div></details>

# この記事をいいねしたユーザの投稿記事タイムライン

${items.length > 0 ? items.join('\n\n') : '(該当する記事は存在しません。)' }
`;

    await execRequest(`https://qiita.com/api/v2/items/${ITEM_ID}`, 'PATCH', {
      body: body,
      private: false,
      tags: [
        { name: 'QiitaAPI' },
        { name: '自動更新' },
        { name: 'ネタ' },
      ],
      title: "この記事をいいねしたユーザの投稿記事タイムラインを自動更新する記事を作成してみた"
    });
  })();
}
thisCode(authorization_token);

この記事をいいねしたユーザの投稿記事タイムライン

(該当する記事は存在しません。)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1