92202


提示コードですがwebサイトの開発ぺージから登録したクライアントキー、クライアントシークレット、アクセストークンを使って  
APIにリクエストを送信したいのですが提示コードのコメント部のように行ってもどれも403エラーが返ってきてしまいます。

※マストドンAPIです

##### 知りたいこと

webページで登録したアプリケーションを使ってＡＰＩにリクエストを送信する方法が知りたい

##### 試したこと

参考サイトのリファレンスを見て行って試しに登録したキーを入力して色々試しましたがどれもエラーが返ってきます。  
`https://mstdn.jp/api/v1/timelines/public`リクエストパラメータが必要ないものも試しましたが同じエラーが出ます。

###### 確認したこと

認証につきましてはwebページにて完了済みでそこそこ時間も経っているので  
時間経過というエラーが原因ということはないと思います、

##### 参考サイト

リファレンス: <https://docs.joinmastodon.org/methods/accounts/>  
試したリクエスト： https://docs.joinmastodon.org/methods/accounts/#following

##### 提示コード

[code]

            static void Print()
            {
     //String url = "https://mstdn.jp/api/v1/accounts?Authorization=-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&username=shigurechan&password=Shigurechan7240&agreement=true&locale=ja";
                //String url = "https://mstdn.jp/oauth/authorize?response_type=read&client_id=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&redirect_uri=urn:ietf:wg:oauth:2.0:oob";
                //String url = "https://mstdn.jp/api/v1/apps?client_name=test&redirect_uris=urn:ietf:wg:oauth:2.0:oob";
                //String url = "https://mstdn.jp/api/v1/apps?client_name=test&redirect_uris=urn:ietf:wg:oauth:2.0:oob";
                //String url = "https://mstdn.jp/api/v1/accounts/verify_credentials?Authorization=EedvO1rwNiq8-KJsRnRowCfak7KXc9ggmdQh84EI33k";
                String url = "https://mstdn.jp/api/v1/timelines/public";
    
                WebRequest request = WebRequest.Create(url);
                Stream response_stream = request.GetResponse().GetResponseStream();
                StreamReader reader = new StreamReader(response_stream);
                var obj_from_json = JObject.Parse(reader.ReadToEnd());
    
                Console.WriteLine(obj_from_json);
    
       
            }
    
            static void Main(string[] args)
            {
               Print();
    
    
                Console.ReadKey();
            }
    
    
[/code]


CC BY-SA 4.0
2022-11-13T07:34:34.900
92200
2022-11-14T12:59:01.473
2022-11-13T09:08:42.110
55177
55177
question
c#
取得したキーを使ってWebAPIにリクエストを送信する方法が知りたい。


認証を行うサンプルコードです。

C#は`Main`メソッドの中身を直接書いても認識しますし、`Main`メソッドは`async`化可能なため、`await`をそのまま利用できます。[`WebRequest`](https://learn.microsoft.com/ja-
jp/dotnet/api/system.net.webrequest?view=net-7.0)は非推奨化されて久しいため、後継の[`HttpClient`](https://learn.microsoft.com/ja-
jp/dotnet/api/system.net.http.httpclient?view=net-7.0)を使用しています。

[code]

    using System.Diagnostics;
    using System.Net.Http.Headers;
    using System.Net.Http.Json;
    using System.Text.Json;
    
    var client_id = "";         // アプリのクライアントキー
    var client_secret = "";     // アプリのクライアントシークレット
    
    using var client = new HttpClient { BaseAddress = new Uri("https://mstdn.jp") };
    // MastodonはUser-Agentが必須なようで、設定されていないと 403 になる。
    client.DefaultRequestHeaders.UserAgent.ParseAdd("test/1.0");
    
    {
        // ブラウザーを起動し、利用者にアプリケーションの承認を求める。得られたコードを受け取る。
        Process.Start("explorer.exe", $"\"{client.BaseAddress}/oauth/authorize?client_id={client_id}&scope=read&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code\"");
        Console.Write("Input code: ");
        var code = Console.ReadLine();
        if (string.IsNullOrEmpty(code))
            throw new Exception();
    
        // 得られたコードを使ってアクセストークンを取得する。
        var parameter = new Dictionary<string, string> {
            { "client_id", client_id },
            { "client_secret", client_secret },
            { "redirect_uri", "urn:ietf:wg:oauth:2.0:oob" },
            { "grant_type", "authorization_code" },
            { "code", code },
            { "scope", "read" },
        };
        using var response = await client.PostAsync("https://mstdn.jp/oauth/token", new FormUrlEncodedContent(parameter));
        var token = await response.EnsureSuccessStatusCode().Content.ReadFromJsonAsync<Token>();
    
        // アクセストークンをclientに記憶させる。このclientを使って他のサイトにアクセスするとこのトークンが流出してしまうので注意。
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "token.access_token");
    }
    
    {
        // 承認した利用者のアカウント情報を取得する。
        var account = await client.GetFromJsonAsync<Account>("/api/v1/accounts/verify_credentials");
    
        // アカウントIDを用いることで承認した利用者のfollowingを取得する。
        var followings = await client.GetStringAsync($"/api/v1/accounts/{account.id}/following");
        Console.WriteLine(followings);
    }
    
    // JSONのデシリアライズ用レコード
    public record Token(string access_token);
    public record Account(string id);
    
[/code]


CC BY-SA 4.0
2022-11-13T09:26:05.663
92202
2022-11-14T12:59:01.473
2022-11-14T12:59:01.473
4236
4236
92200
answer