Qiita APIでQuine投稿(Node.js)


# TL;DR

**この記事は、[Qiita API v2 の記事作成API](https://qiita.com/api/v2/docs#post-apiv2items)を使用して作成し、[この記事の最後](#この記事のapiを実行したコード)に、この記事自体を作成するコードを記載しています。**

# はじめに

APIを使用して投稿した記事に、**実際に投稿に使用したコード**を記載したいと思いましたが、
下記のようにコードを直接記載すると、**APIを使用するコード部分が再帰的になり**、記載ができませんでした。

``` javascript
  item_create_request({
    title: 'hogehoge',
    body: `
# JavaScriptでHelloWorld

\`\`\`
console.log('HelloWorld');
\`\`\`

# 使用したコード

\`\`\` javascript
  item_create_request({
    title: 'hogehoge',
    body: \`
# JavaScriptでHelloWorld

\\\`\\\`\\\`
console.log('HelloWorld');
\\\`\\\`\\\`

# 使用したコード

(困った。個々の部分が再帰的になってしまい記載できない。)

\`\`\`

`
  })

```

つまり、**[クワイン(プログラミング)](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AF%E3%82%A4%E3%83%B3_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))**のような工夫が必要です。

この記事では、**JavaScriptの関数はtoStringでソースコードの文字列を取得できる**ことを利用して実現しました。

以下にNode.jsでのコード例を示します。

``` javascript
const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = (authorization_token) => {
  const item_title = '記事タイトル';
  const item_tags = [
    { name: 'タグ1' },
    { name: 'タグ2' },
  ];
  const item_body = `

★★ここに、記事本文を記載する★★

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

`;

  const request = require('request');
  request(
    {
      url: 'https://qiita.com/api/v2/items',
      method: 'POST',
      headers: { Authorization: authorization_token, 'Content-Type': 'application/json' },
      json: {
        private: false,
        title: item_title,
        tags: item_tags,
        body: item_body,
      },
    },
    (error, response, body) => console.log(error ? 'request fail' : 'request success')
  );
}
thisCode(authorization_token);
```

# 注意点

自身の**Authorizationのtokenを記事で晒すのは大変危険**です。

上記コード例の先頭の「authorization_token」は実際は自身のtokenを記載して下さい（authorization_tokenは実際のコードと異なります）

2番目(コードエリアのauthorization_token)はもちろんダミーのままにして下さい

# 試すときのポイント

上記のコード例の、requestのjsonのprivateをtrueにすると、限定共有記事となり、気軽に試すことができます。

~~本記事もマークダウンでの表示を確認するために限定共有での投稿/削除を繰り返しました。~~

# その他

evalを使った例や、他の言語の例もあると、Qiita APIの参考になるかも。

ちなみに、自動更新(記事更新)の例は自身の[こちらの記事](https://qiita.com/j5c8k6m8/items/1f23349c2521d916ed1a)に載せてます。

# この記事のAPIを実行したコード

~~\エスケープ地獄~~

```  javascript:myCode.js
const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = (authorization_token) => {
  const item_title = 'Qiita APIでクワイン投稿(Node.js)';
  const item_tags = [
    { name: 'QiitaAPI' },
    { name: 'Node.js' },
    { name: 'JavaScript' },
    { name: 'quine' },
    { name: 'Quine投稿' },
  ];
  const item_body = `
# TL;DR

**この記事は、[Qiita API v2 の記事作成API](https://qiita.com/api/v2/docs#post-apiv2items)を使用して作成し、[この記事の最後](#この記事のapiを実行したコード)に、この記事自体を作成するコードを記載しています。**

# はじめに

APIを使用して投稿した記事に、**実際に投稿に使用したコード**を記載したいと思いましたが、
下記のようにコードを直接記載すると、**APIを使用するコード部分が再帰的になり**、記載ができませんでした。

\`\`\` javascript
  item_create_request({
    title: 'hogehoge',
    body: \`
# JavaScriptでHelloWorld

\\\`\\\`\\\`
console.log('HelloWorld');
\\\`\\\`\\\`

# 使用したコード

\\\`\\\`\\\` javascript
  item_create_request({
    title: 'hogehoge',
    body: \\\`
# JavaScriptでHelloWorld

\\\\\\\`\\\\\\\`\\\\\\\`
console.log('HelloWorld');
\\\\\\\`\\\\\\\`\\\\\\\`

# 使用したコード

(困った。個々の部分が再帰的になってしまい記載できない。)

\\\`\\\`\\\`

\`
  })

\`\`\`

つまり、**[クワイン(プログラミング)](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AF%E3%82%A4%E3%83%B3_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))**のような工夫が必要です。

この記事では、**JavaScriptの関数はtoStringでソースコードの文字列を取得できる**ことを利用して実現しました。

以下にNode.jsでのコード例を示します。

\`\`\` javascript
const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = (authorization_token) => {
  const item_title = '記事タイトル';
  const item_tags = [
    { name: 'タグ1' },
    { name: 'タグ2' },
  ];
  const item_body = \`

★★ここに、記事本文を記載する★★

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

\`;

  const request = require('request');
  request(
    {
      url: 'https://qiita.com/api/v2/items',
      method: 'POST',
      headers: { Authorization: authorization_token, 'Content-Type': 'application/json' },
      json: {
        private: false,
        title: item_title,
        tags: item_tags,
        body: item_body,
      },
    },
    (error, response, body) => console.log(error ? 'request fail' : 'request success')
  );
}
thisCode(authorization_token);
\`\`\`

# 注意点

自身の**Authorizationのtokenを記事で晒すのは大変危険**です。

上記コード例の先頭の「authorization_token」は実際は自身のtokenを記載して下さい（authorization_tokenは実際のコードと異なります）

2番目(コードエリアのauthorization_token)はもちろんダミーのままにして下さい

# 試すときのポイント

上記のコード例の、requestのjsonのprivateをtrueにすると、限定共有記事となり、気軽に試すことができます。

~~本記事もマークダウンでの表示を確認するために限定共有での投稿/削除を繰り返しました。~~

# その他

evalを使った例や、他の言語の例もあると、Qiita APIの参考になるかも。

ちなみに、自動更新(記事更新)の例は自身の[こちらの記事](https://qiita.com/j5c8k6m8/items/1f23349c2521d916ed1a)に載せてます。

# この記事のAPIを実行したコード

~~\\エスケープ地獄~~

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

`;

  const request = require('request');
  request(
    {
      url: 'https://qiita.com/api/v2/items',
      method: 'POST',
      headers: { Authorization: authorization_token, 'Content-Type': 'application/json' },
      json: {
        private: false,
        title: item_title,
        tags: item_tags,
        body: item_body,
      },
    },
    (error, response, body) => console.log(error ? 'request fail' : 'request success')
  );
}
thisCode(authorization_token);
```