Перейти к содержимому
  • 0
Hikooshi

Как скачать файл?

Вопрос

подскажите, в чем дело
есть программа pastebin, чтоб с пастбина качать, пробую код функции get() в консоли писать - запрос, вроде, происходит, но чанки не возвращаются и файл ничего не записывается

если точнее, то вот эта часть кода

for chunk in response do
 --     if not options.k then
        string.gsub(chunk, "\r\n", "\n")
 --     end
      f:write(chunk)
    end

http-запросы открыты и через саму программу скачать файл получается

ах да, через response.read() получается прочитать текст кода, то есть response.read(4) возращает первые четыре символа кода

Изменено пользователем Hikooshi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0
3 часа назад, Hikooshi сказал:

...

Немного не понял, о чём ты, ты хочешь встроить скачивание с пастебина к себе куда-то? internet.request же работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
Только что, BrightYC сказал:

Немного не понял, о чём ты, ты хочешь встроить скачивание с пастебина к себе куда-то? internet.request же работает

хочу через интерпретатор проверить, как оно работает, но цикл почему-то не возвращает ничего (цикл с чанками), хотя через .read() можно текст вернуть. Вот и спрашиваю, что не так, если в программе этот цикл работает, а в консоли (интерпретаторе) - нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 минуту назад, Hikooshi сказал:

хочу через интерпретатор проверить, как оно работает, но цикл почему-то не возвращает ничего (цикл с чанками), хотя через .read() можно текст вернуть. Вот и спрашиваю, что не так, если в программе этот цикл работает, а в консоли (интерпретаторе) - нет

Да вроде всё работает, и цикла я там не увидел. Попробуй в интерпретаторе запустить этот код:
result, response = pcall(internet.request, "http://example.org/") if result then for chunk in response do print(chunk) end end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
Только что, BrightYC сказал:

Да вроде всё работает, и цикла я там не увидел. Попробуй в интерпретаторе запустить этот код:
result, response = pcall(internet.request, "http://example.org/") if result then for chunk in response do print(chunk) end end

именно так я и делал, принт просто ничего не возращал, то есть:

> result, response = pcall(internet.request, "http://example.org/") if result then for chunk in response do print(chunk) end end

>

пустая строка дальше выдается

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 час назад, Hikooshi сказал:

именно так я и делал, принт просто ничего не возращал, то есть:

> result, response = pcall(internet.request, "http://example.org/") if result then for chunk in response do print(chunk) end end

>

пустая строка дальше выдается

Это уже на стороне тебя проблемы, у меня все принтится:

Скрытый текст

rUuyQ5u.png


Утром возможно знатоки придут, возможно что-то скажут 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 час назад, BrightYC сказал:

Это уже на стороне тебя проблемы, у меня все принтится...

Утром возможно знатоки придут, возможно что-то скажут 

хмм, это очень интересно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@Hikooshi На будущее: вопросы по программированию лучше задавать в этом разделе > Программирование > Вопросы.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@Hikooshi какая версия OC? Через wget с пастбина качается нормально?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

ошибку нашел, нужно было писать internet.request(), а я вводил component.internet.request(). Теперь объясните, почему через вызов компонента не работает?

result, response = pcall(internet.request, " адрес ") for chunk in response do print(chunk) end

for chunk in internet.request(" адрес ") do print(chunk) end

оба кода в консоли работают одинаково, почему так? В смысле, почему не нужно в данном случае указывать component?

версия OC 1.74

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@Hikooshi  просто на будущее internet, как и filesystem, event... и пр. считай, как библиотеки. Хоть и internet как бы в теории и подключает(точнее обращается) к сетевой карте, но она не является компонентом, видимо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
52 минуты назад, Hikooshi сказал:

...

Потому что библиотеки robot, internet, event - это обёртка над компонентами, которая предоставляет более удобный интерфейс для обработки. Допустим чтобы повернуть роботом именно через компонент - надо писать не robot.turnRight(), а component.robot.turn(true)

А с internet все ещё проще. На самой вики даже написано, что component.internet обладает базовыми функциями, без удобной обёртки "internet"

P.S Если нужно через компонент - нужно перед каждый получением данных добавить "холостой" .read(), не знаю с чем это связано. Через компонент данные получает не в чанках, а просто как строку.

Изменено пользователем BrightYC

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Собственно, в самой обертке это все и видно. Делается реквест, затем читаются данные до конца, реквест закрывается и все это  сворачивается в объект, из которого получаем данные на блюдечке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

все понятно, и да, через .read() информация читалась, но очень такой способ неудобный. Всем спасибо

Изменено пользователем Hikooshi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

еще вопрос

если в консоли написать

result, response = pcall(internet.request, "https://pastebin.com/raw/".. a), где a - намеренно неверная ссылка

d, r =response.read()

то консоль вернет значения

d == nil      r == адрес

НО, если то же самое сделать через программу, то вернет

d == ""       r == nil

в чем проблема здесь?

хотя меня больше интересует вопрос, как люди делают фильтр неправильных ссылок, ведь result в этих случаях будет true

Изменено пользователем Hikooshi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
5 часов назад, Hikooshi сказал:

хотя меня больше интересует вопрос, как люди делают фильтр неправильных ссылок, ведь result в этих случаях будет true

Как вообще компьютер может знать, что ссылка "неправильная?"

Он устанавливает соединение, для него эта ссылка уже правильная, поэтому и возвращает true.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
7 часов назад, Hikooshi сказал:

хотя меня больше интересует вопрос, как люди делают фильтр неправильных ссылок

а что ты делаешь? браузер какой-то? Напиши лучше пример конкретно, где и с чем ты столкнулся с какой-то проблемой. Так будет понятнее другим форумчанам, как решить твою проблемку.

 

п.с. Да и фильтра, скорее всего, не существует никакого в природе. Просто проверяй, что ты там в респонсе получил. Получил nil или пустую строку "", так и пиши, что, мол, страница не найдена, или типа того. Вот и всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
3 часа назад, Alex сказал:

а что ты делаешь? браузер какой-то? Напиши лучше пример конкретно, где и с чем ты столкнулся с какой-то проблемой. Так будет понятнее другим форумчанам, как решить твою проблемку.

 

п.с. Да и фильтра, скорее всего, не существует никакого в природе. Просто проверяй, что ты там в респонсе получил. Получил nil или пустую строку "", так и пиши, что, мол, страница не найдена, или типа того. Вот и всё.

можно было бы и так сделать, но в любом случае и в правильном и в неправильном, через .read() возвращается "", если б было как в консоли, то есть при неверной ссылке возвращался бы nil, то фильтровать очень просто можно было бы

в общем, есть таблица [название файла] = "его айди". Айдишник считывается из определенного места файла и если на том месте не айдишник, а что-то другое, то цикл for chunk in response do ... end выдаст ошибку и программа завершится. Вот я и ищу способ сделать фильтр

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@Hikooshi честно говоря ничего не понял) В каком смысле  но в любом случае и в правильном и в неправильном, через .read() возвращается ""?

Что за консоль. Что программа твоя делает?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
11 час назад, Alex сказал:

@Hikooshi честно говоря ничего не понял) В каком смысле  но в любом случае и в правильном и в неправильном, через .read() возвращается ""?

Что за консоль. Что программа твоя делает?

 

обновляет файлы с пастбина

айди файла находится в самом файле в определенном месте, но если в том месте будет любое другое слово, то программа вылетит с ошибкой.

Сначала в программе открывается список файлов, считываются из того определенного места значения айдишников, получается таблица [название файла] = "айди". Потом в цикле из этой таблицы берутся айдишники и происходят реквесты internet.request("https://pastebin.com/raw/"..айди). Вот тут самое интересное и начинается: если айдишник это именно айдишник, то все нормально работает, чанки возвращают данные и файл перезаписывается, но если вместо айдишника будет просто слово, например "component" или какой другое, то цикл с чанками выдаст ошибку и, как написано выше, программа просто вылетит. Поэтому хотел сделать фильтр, чтоб при неправильном айдишнике просто код переходил к следующему из таблицы.

Если в консоли сделать так:

> response = internet.request("https://pastebin.com/raw/правильный айди")

> =response.read()

то консоль вернет

> ""

то же самое происходит и в программе, то есть можно было бы сделать так data, result = response.read(); if data then for chunk in response do ... end end

Если же в консоли написать так:

> response = internet.request("https://pastebin.com/raw/НЕправильный айди")

> =response.read()

то консоль вернет

> nil         адрес

НО в программе происходит то же самое, что и в консоли при варианте с правильным айди, то есть возвращается пустая строка на месте первой переменной, а не nil, поэтому фильтровать не получается таким способом

 

проблема решена: между internet.request и response.read() добавил os.sleep(1), минимум времени может быть 0.3, хотя, возможно, зависит от сайта

Изменено пользователем Hikooshi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
4 часа назад, Hikooshi сказал:

проблема решена: между internet.request и response.read() добавил os.sleep(1), минимум времени может быть 0.3, хотя, возможно, зависит от сайта

хмм, хренька какая-то. Это какая версия ос-ки? То есть ты хочешь сказать, что соединение еще только выполняется, оно еще только в процессе, а прога уже хочет прочитать то, что вернул запрос? Так же не должно быть по идее. Это же ерунда какая-то несусветная? Или нет?

п.с. кстати, вот нашел старую функцию какую-то, с которой никаких проблем не было никогда. Со времен царя гороха она работает и никаких проблем. Никаких слипов ей не требовалось никогда. Первый раз такое слышу, что слип там необходим для устойчивой работы.
 

function get(url)
  local request, reason = internet.request(url)
  if not request then return '' end
 
  local text = ''
  while true do
    local data, reason = request.read()
    if not data then
      request.close()
      break
    elseif #data > 0 then
      text = text..data
    end
  end
  return text
end



 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...