我正在根据示例尝试实现Google Translator和C#。
我收到错误消息:“远程服务器返回错误消息:(403)禁止。”
错误出现在行中:
using (var responseStream = request.GetResponse().GetResponseStream())
问题 如何解决错误?
本文介绍了在线服务“ Google Translate(https://translate.google.com/)的用法,该查询形成了带有翻译所需文本的查询,并对使用“ HtmlAgilityPack”库获得的结果进行语法分析。
//
// using HtmlAgilityPack;
namespace _359._01._01
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
button1.PerformClick();
}
private void button1_Click(object sender, EventArgs e)
{
//Вызываем метод отправки текста для перевода с указанием
//исходного языка и языка перевода.
//И получаем в ответ HTML код страницы ответа.
string result = translate(richTextBox1.Text, "en", "ru");
//Создаем объект класса HtmlDocument.
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
//Загружаем в doc полученный HTML.
doc.LoadHtml(result);
//У созданного объекта doc есть свойство DocumentNode (указывает на верхний узел документа).
//У него же в свою очередь есть методы SelectNodes и SelectSingleNode.
//Первый выбирает коллекцию элементов, а второй — только один. Нам нужен первый метод.
HtmlAgilityPack.HtmlNodeCollection translateNode = doc.DocumentNode.SelectNodes("//span[@id='result_box']");
//Проверяем количество найденных элементов.
if (translateNode.Count != 0)
{
//Элементы найдены, получаем текст между начальным и конечным тегами объекта.
richTextBox2.Text = translateNode[0].InnerText;
}
else
{
//Необходимые нам элементы, отсутствуют на странице.
richTextBox2.Text = "Проблема с переводом";
}
}
//word - фраза для перевода, SL -исходный язык, DL - язык перевода.
public string translate(string word, string SL, string DL)
{
//Инициализируем новый экземпляр класса System.Net.CookieContainer.
var cookies = new System.Net.CookieContainer();
string result;
//Задаем значение System.Boolean, которое определяет, используется
//ли поведение 100-Continue.
System.Net.ServicePointManager.Expect100Continue = false;
//Формируем строку запроса на перевод.
string zapros = "http://translate.google.ru/?sl=" + SL + "&tl=" + DL + "&q=" + word;
//Инициализируем новый экземпляр System.Net.WebRequest для заданной схемы URI.
var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(zapros);
request.CookieContainer = cookies;
//Указываем системные учетные данные приложения.
request.Credentials = System.Net.CredentialCache.DefaultCredentials;
//Указываем сетевые учетные данные текущего контекста безопасности.
request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
//Задаем метод для запроса.
request.Method = "POST";
//Задаем значение HTTP-заголовка Content-type.
request.ContentType = "application/x-www-form-urlencoded"; // Исх
// request.ContentType = "application/json; charset=UTF-8"; // НР
// request.ContentType = "application/json;"; // НР
//Задаем значение HTTP-заголовка User-agent.
request.UserAgent = @"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4"; // Исходный
request.UseDefaultCredentials = true;
//Получаем объект System.IO.Stream, используемый для записи данных запроса.
using (var requestStream = request.GetRequestStream())
//При переопределении во вложенном классе получаем поток данных из
//интернет-ресурса.
using (var responseStream = request.GetResponse().GetResponseStream()) // ОШИБКА
//Инициализируем новый экземпляр класса System.IO.StreamReader для указанного
//потока с заданной кодировкой символов.
using (var reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("UTF-8")))
{
//Считываем поток от текущего положения до конца.
result = reader.ReadToEnd();
}
//Возвращаем полученную строку с HTML кодом страницы.
return result;
}
}
}