Ya tengo dos bots en funcionamiento en Wikipedia, pero usan un método diferente. Actualmente, estoy tratando de crear un bot usando C#. En la página de documentación de la API, han proporcionado algunos códigos de muestra en java, PHP y python. Pero desafortunadamente, no han proporcionado ningún código de muestra en C#. Es el único idioma que conozco.
Esta es la API de Wikimedia: Editar página de documentación. ¿Alguien amablemente convertiría las pocas palabras de java (o cualquier otro idioma) a C#?
Si pudiera convertir solo este código a C#, podría construir el resto del bot por mí mismo. Pedí ayuda en los tablones de anuncios relevantes en los sitios de wikimedia, pero nadie allí está familiarizado con C#. Es por eso que ahora estoy preguntando esto fuera de wikipedia.
Muchas gracias por adelantado
Este es el código fuente de Java:
``` /* edit.js MediaWiki API Demos Demo of `Login` module: Sending post request to login MIT license */ var request = require( 'request' ).defaults( { jar: true } ), url = 'https://test.wikipedia.org/w/api.php'; // Step 1: GET request to fetch login token function getLoginToken() { var params = { action: 'query', meta: 'tokens', type: 'login', format: 'json' }; request.get( { url: url, qs: params }, function ( error, res, body ) { var data; if ( error ) { return; } data = JSON.parse( body ); loginRequest( data.query.tokens.logintoken ); } ); } // Step 2: POST request to log in. // Use of main account for login is not // supported. Obtain credentials via Special:BotPasswords // (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword function loginRequest( loginToken ) { var params = { action: 'login', lgname: 'bot_username', lgpassword: 'bot_password', lgtoken: loginToken, format: 'json' }; request.post( { url: url, form: params }, function ( error, res, body ) { if ( error ) { return; } console.log( body ); } ); } // Start From Step 1 getLoginToken();No puedo profundizar tanto, pero espero que puedas echar un vistazo a esta página y descubrir cómo hacerlo.
https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-6.0
Puedes intentar algo como esto
private static async Task LoginRequest(string loginToken) { var data = new { action = "login", lgname = "bot_username", lgpassword = "bot_password", lgtoken = loginToken, format = "json" }; using (var client = new HttpClient()) using (var response = await client.PostAsJsonAsync(LOGIN_URL, data)) { var responseString = await response.Content.ReadAsStringAsync(); var responseObject = JsonConvert.DeserializeObject<JObject>(responseString); Console.WriteLine(responseObject); } } private static async Task<string?> GetLoginToken() { var url = $"{LOGIN_URL}?action=query&meta=tokens&type=login&format=json"; using (var client = new HttpClient()) using (var response = await client.GetAsync(url)) { var responseString = await response.Content.ReadAsStringAsync(); var responseObject = JsonConvert.DeserializeObject<JObject>(responseString); return responseObject?["query"]?["tokens"]?["logintoken"]?.ToString(); } }Para convertir la respuesta que necesita
using Newtonsoft.Json; using Newtonsoft.Json.Linq; Puede llamar a estos métodos desde su método Main de esta manera:
const string LOGIN_URL = "https://test.wikipedia.org/w/api.php"; public static async Task Main() { var loginToken = await GetLoginToken(); await LoginRequest(loginToken ?? throw new Exception("No login token.")); }