Size: a a a

2020 January 21

M

Mark in pro.elixir
Sergei Maximov
post "/:bot_token"

А в контроллере (или с помощью plug) проверяешь conn.path_params["bot_token"]
вот с этим сейчас попробую разобраться
источник

SM

Sergei Maximov in pro.elixir
Sergei Maximov
Ну у нас же на дворе 1.9.4, надо Application.fetch_env!/2 использовать!
Или Application.compile_env!/2 с приходом 1.10
источник

M

Mark in pro.elixir
Sergei Maximov
Ну у нас же на дворе 1.9.4, надо Application.fetch_env!/2 использовать!
а я вот так делал System.get_env("BOT_TOKEN")
источник

LL

Lama Lover in pro.elixir
Sergei Maximov
Или Application.compile_env!/2 с приходом 1.10
А что это делает?
источник

SM

Sergei Maximov in pro.elixir
Lama Lover
А что это делает?
источник

LL

Lama Lover in pro.elixir
Ааа, макрос
источник

LL

Lama Lover in pro.elixir
Ну раньше можно было бы так
@attr Application.fetch_env!(...)
источник

LL

Lama Lover in pro.elixir
Ну да, теперь чуть-чуть удобнее будет
источник

SM

Sergei Maximov in pro.elixir
Mark
а я вот так делал System.get_env("BOT_TOKEN")
У нас в прилаге так. Роутер:

  pipeline :telegram do
   plug :accepts, ["json"]

   plug MyAppWeb.Plugs.Telegram.CheckBotToken

   plug Plug.Parsers,
     parsers: [MyApp.Parsers.TelegramJSON],
     pass: ["*/*"]
 end

 scope "/webhook/:bot_token", MyAppWeb do
   pipe_through :telegram

   post "/", WebhookController, :update
 end

CheckBotToken:

defmodule MyAppWeb.Plugs.Telegram.CheckBotToken do
 @behaviour Plug

 import Plug.Conn

 require Logger

 @impl Plug
 def init(opts), do: opts

 @impl Plug
 def call(conn, _opts) do
   if Map.get(conn.path_params, "bot_token") == Nadia.Config.token() do
     conn
   else
     Logger.warn("Incoming webhook request didn't provide a valid bot token, halting...")

     conn
     |> send_resp(:no_content, "")
     |> halt()
   end
 end
end
источник

LL

Lama Lover in pro.elixir
Sergei Maximov
У нас в прилаге так. Роутер:

  pipeline :telegram do
   plug :accepts, ["json"]

   plug MyAppWeb.Plugs.Telegram.CheckBotToken

   plug Plug.Parsers,
     parsers: [MyApp.Parsers.TelegramJSON],
     pass: ["*/*"]
 end

 scope "/webhook/:bot_token", MyAppWeb do
   pipe_through :telegram

   post "/", WebhookController, :update
 end

CheckBotToken:

defmodule MyAppWeb.Plugs.Telegram.CheckBotToken do
 @behaviour Plug

 import Plug.Conn

 require Logger

 @impl Plug
 def init(opts), do: opts

 @impl Plug
 def call(conn, _opts) do
   if Map.get(conn.path_params, "bot_token") == Nadia.Config.token() do
     conn
   else
     Logger.warn("Incoming webhook request didn't provide a valid bot token, halting...")

     conn
     |> send_resp(:no_content, "")
     |> halt()
   end
 end
end
nice
источник

M

Mark in pro.elixir
Sergei Maximov
У нас в прилаге так. Роутер:

  pipeline :telegram do
   plug :accepts, ["json"]

   plug MyAppWeb.Plugs.Telegram.CheckBotToken

   plug Plug.Parsers,
     parsers: [MyApp.Parsers.TelegramJSON],
     pass: ["*/*"]
 end

 scope "/webhook/:bot_token", MyAppWeb do
   pipe_through :telegram

   post "/", WebhookController, :update
 end

CheckBotToken:

defmodule MyAppWeb.Plugs.Telegram.CheckBotToken do
 @behaviour Plug

 import Plug.Conn

 require Logger

 @impl Plug
 def init(opts), do: opts

 @impl Plug
 def call(conn, _opts) do
   if Map.get(conn.path_params, "bot_token") == Nadia.Config.token() do
     conn
   else
     Logger.warn("Incoming webhook request didn't provide a valid bot token, halting...")

     conn
     |> send_resp(:no_content, "")
     |> halt()
   end
 end
end
Ух ты, спасибо)
источник

МБ

Максим Барулин in pro.elixir
я, конечно, чего-то мог не понять, но использовать токен бота в каждом запросе это как-то не очень безопасно... Почему-бы просто не заменить его на какой-то рандомный хэш, который скормить вместе с адресом хука в телегу, и сравнивать уже этот хук, а не токен бота
источник

SM

Sergei Maximov in pro.elixir
Максим Барулин
я, конечно, чего-то мог не понять, но использовать токен бота в каждом запросе это как-то не очень безопасно... Почему-бы просто не заменить его на какой-то рандомный хэш, который скормить вместе с адресом хука в телегу, и сравнивать уже этот хук, а не токен бота
Да, так наверно будет лучше
источник

D

Dk in pro.elixir
https://elixirschool.com/ru/lessons/advanced/gen-stage/

Какой раз читаю пример из GenStage и никак не понимаю. Объясните по-тупому.
В Производителе A определяется функция handle_demand(demand, state), которая принимает demand.
В Производителе-потребителе B определяется handle_events. Она ничего не вызывает.

Так кто и где вызывает функцию handle_demand и передаёт мифическое значение demand, которое нигде не обозначено?
источник

PG

Pïg Grëënëst in pro.elixir
1) demand вычисляется автоматически на основе опций min_demand и max_demand подписки
2) demand это второй параметр ask
источник

PG

Pïg Grëënëst in pro.elixir
есть колбэк handle_subscribe, через него можно выбрать поведение консьюмера (automatic, 1, дефолт или manual, 2)
источник

D

Dk in pro.elixir
Я думал, в demand можно свои аргументы передать, чтобы производитель их обработал
источник

PG

Pïg Grëënëst in pro.elixir
источник

D

Dk in pro.elixir
Как я писал: У меня есть много ссылок, которые надо распарсить.

В общем, идея была такой:
[A] -> [B] -> [C]
В A загружается список ссылок, которые надо обработать
B - несколько производителей-потребителей, которые эти ссылки обрабатывают и передают их в единственный C
Я как-то должен из C эти обработанный данные единственным вызовом забрать.

Где я ошибся?
источник

PG

Pïg Grëënëst in pro.elixir
может тебе не gen_stage нужен, а Task?
источник