ForkしたレポジトリをAppVeyorに追加したい

## AppVeyorにプロジェクトを追加したい
現在関わっているLaravelの案件、自動テストを<a href='https://www.appveyor.com/' target='_blank'>AppVeyor</a>で行っている。（難しい設定を行っているのは別のスタッフなので私はサワリの部分しか知らないけど）  
ひとつの案件にかかわるレポジトリがみっつある。  
今回みっつめのレポジトリの自動テストを追加しようとしたところ、プロジェクトの追加画面に該当のレポジトリが表示されないという事態に遭遇した。

## Forkしたレポジトリはプロジェクト追加画面に登場しないらしい
原因を探ったところ、プロジェクト追加済みの他のふたつのレポジトリと今回追加できなかったレポジトリとの違いは、Forkされたレポジトリかどうかということらしい。

## AppVeyorのAPI経由で追加する
ググったところ以下の質疑応答ページが見つかった。  
<a href="https://help.appveyor.com/discussions/questions/935-is-it-possible-to-add-forks-to-the-projects" target="_blank">https://help.appveyor.com/discussions/questions/935-is-it-possible-to-add-forks-to-the-projects</a>

AppVeyorの用意しているAPI経由で追加するらしい。

やってみた。  
私はコンソールでAPIに接続するのに慣れていないので、PHPでプログラムを書きXAMPPでローカルで実行し、APIに接続した。

用意したPHPファイルはみっつ。
* index.php : 入力フォームを表示
* send.php : ApiConnecterを使ってWebAPIに接続し、戻り値を表示する
* ApiConnecter.php : WebAPIに要求を送るユーティリティ

「トークン」はAppVeyorの<a href="https://ci.appveyor.com/api-token" target="_blank">「API Token」ページ</a>で取得できるもの。

---

![スクリーンショット 2018-02-26 9.50.51.png](https://qiita-image-store.s3.amazonaws.com/0/159641/0b0c9e60-78a4-130b-9ce1-4a1fd6d09abe.png)

---

```
// index.php
<h1>AppVeyor にForkレポジトリを追加するためのAPI接続プログラム</h1>
<form action="send.php" method="POST">
  apiUrl : <input type="text" name="apiUrl" value="https://ci.appveyor.com/api/projects" /><br>
  repositoryProvider : <input type="text" name="repositoryProvider" value="gitHub" /><br>
  repositoryName : <input type="text" name="repositoryName" value="追加したいレポジトリ名" /><br>
  token : <input type="text" name="token" value="トークン" /><br>
  <input type="submit" value="送信" />
</form>
```

```
// send.php
<?php 
require('./ApiConnecter.php');

$post_array = [
  'repositoryProvider' => $_REQUEST['repositoryProvider'],
  'repositoryName' => $_REQUEST['repositoryName'],
];
$apiUrl = $_REQUEST['apiUrl'];
$token = $_REQUEST['token'];

$response = ApiConnecter::postDataAndGetContentFromUrl(
  $apiUrl,
  $post_array,
  $token
);

var_dump($response);
```

```
// ApiConnecter.php
<?php
/**
 * WebAPIに接続して戻り値を取得する。
 */
class ApiConnecter{
    ////////////////////////////////////////////////////////////
    /**
     * @param  接続先APIのURL
     * @param  array POST送信する値のセットの連想配列
     * @param  トークン
     * @param  string 送信メソッド（GET / POST）
     * @return APIからの戻り値
     */
    public static function postDataAndGetContentFromUrl(
        $api_url,
        $post_array,
        $token,
        $method = 'POST'
    ){
        $data = http_build_query($post_array, "", "&");
        $options_array = array();
        $options_array["http"]["method"]  = $method;
        $options_array["http"]["header"]  = "Content-type: application/x-www-form-urlencoded\r\n"
                                          . "Content-Length: " . strlen($data) . "\r\n"
                                          . "Authorization: "  . "Bearer ".$token."\r\n";
        $options_array["http"]["content"] = $data;

        $context = stream_context_create();
        stream_context_set_option(
            $context,
            $options_array
        );

        try{
            $return_data = file_get_contents(
                $api_url, //接続先のURL
                false,    //パス検索
                $context  //送信する内容（リソースコンテクスト）
            );
        }catch(Exception $e){
            $return_data = "エラー : APIからのデータ取得に失敗しました。<br>\n".$e;
        }
        return $return_data;
    }
}
```

これでAPIに要求を送信したところ、プロジェクト追加がうまく行った。  
AppVeyorのプロジェクト追加画面を経ずにプロジェクトを追加したということになりますね。