Merge d530a8d71d into b14a0a89bd
This commit is contained in:
commit
93f194d964
|
|
@ -1,34 +1,31 @@
|
||||||
namespace Hacker_Scripts
|
using Twilio;
|
||||||
|
using Twilio.Rest.Api.V2010.Account;
|
||||||
|
|
||||||
|
//Exit early if any session with my username is found
|
||||||
|
if (args[0] is null)
|
||||||
{
|
{
|
||||||
using System;
|
return;
|
||||||
using Twilio;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
class Hangover
|
|
||||||
{
|
|
||||||
public static string TWILIO_ACCOUNT_SID = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID");
|
|
||||||
public static string AUTH_TOKEN = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN");
|
|
||||||
|
|
||||||
public static string YOUR_NUMBER = "9879789978";
|
|
||||||
public static string BOSS_NUMBER = "3213213233";
|
|
||||||
|
|
||||||
static void Main(string[] args)
|
|
||||||
{
|
|
||||||
var twilio = new TwilioRestClient(TWILIO_ACCOUNT_SID, AUTH_TOKEN);
|
|
||||||
|
|
||||||
string[] randomMessages = {
|
|
||||||
"Locked out",
|
|
||||||
"Pipes broke",
|
|
||||||
"Food poisoning",
|
|
||||||
"Not feeling well"
|
|
||||||
};
|
|
||||||
|
|
||||||
int randomIndex = new Random().Next(randomMessages.Count());
|
|
||||||
String messageToSend = (randomMessages[randomIndex]);
|
|
||||||
|
|
||||||
var message = twilio.SendMessage(YOUR_NUMBER, BOSS_NUMBER, messageToSend);
|
|
||||||
Console.WriteLine(message.Sid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var twilioAccountSid = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID");
|
||||||
|
var authToken = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN");
|
||||||
|
|
||||||
|
//Phone numbers
|
||||||
|
const string myNumber = "+xxx";
|
||||||
|
const string numberOfBoss = "+xxx";
|
||||||
|
|
||||||
|
TwilioClient.Init(twilioAccountSid, authToken);
|
||||||
|
|
||||||
|
var excuses = await new ChatGpt().GetExcusesToMyBoss();
|
||||||
|
|
||||||
|
var rand = new Random().Next(excuses.Length);
|
||||||
|
var message = $"Gonna work from home. {excuses[rand]}";
|
||||||
|
|
||||||
|
//Send a text message
|
||||||
|
var response = MessageResource.Create(
|
||||||
|
body: message,
|
||||||
|
from: new Twilio.Types.PhoneNumber(myNumber),
|
||||||
|
to: new Twilio.Types.PhoneNumber(numberOfBoss)
|
||||||
|
);
|
||||||
|
|
||||||
|
Console.WriteLine(response.Sid);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
using System.Net.Http.Headers;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace Temp.OpenAi;
|
||||||
|
|
||||||
|
public sealed class ChatGpt
|
||||||
|
{
|
||||||
|
private readonly HttpClient _httpClient;
|
||||||
|
private const string OpenAiSecret = "your secret api";
|
||||||
|
private const string ApplicationJsonMediaTypeRequest = "application/json";
|
||||||
|
private const string AcceptHeaderRequest = "Accept";
|
||||||
|
private const string OpenAiApiBaseUrl = "https://api.openai.com/v1/";
|
||||||
|
private readonly JsonSerializerOptions _serializerOptions = new()
|
||||||
|
{
|
||||||
|
PropertyNameCaseInsensitive = true
|
||||||
|
};
|
||||||
|
public ChatGpt()
|
||||||
|
{
|
||||||
|
_httpClient = new HttpClient();
|
||||||
|
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", OpenAiSecret);
|
||||||
|
_httpClient.BaseAddress = new Uri(OpenAiApiBaseUrl);
|
||||||
|
_httpClient.DefaultRequestHeaders.Add(AcceptHeaderRequest, ApplicationJsonMediaTypeRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<string>> GetReasonsToMyBitch()
|
||||||
|
{
|
||||||
|
const string prompt = "Return only a CSV list separated by semicolons, of phrases with various reasons that justify " +
|
||||||
|
"my delay in leaving work, to my wife. Do not repeat this question in your response. " +
|
||||||
|
"Only the raw CSV. No double quotes. Just raw CSV";
|
||||||
|
|
||||||
|
return await DoRequest(prompt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<string>> GetExcusesToMyBoss()
|
||||||
|
{
|
||||||
|
const string prompt = "Return only a CSV list separated by semicolons, of phrases with various reasons that " +
|
||||||
|
"justify why I can't go out for a drink with my boss. Do not repeat this question in " +
|
||||||
|
"your response. Only the raw CSV. No double quotes. Just raw CSV";
|
||||||
|
|
||||||
|
return await DoRequest(prompt);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<List<string>> DoRequest(string prompt)
|
||||||
|
{
|
||||||
|
var promptJson = new CompletionChatRequest
|
||||||
|
{
|
||||||
|
Messages = new List<CompletionChatMessage>
|
||||||
|
{
|
||||||
|
new() { Content = prompt }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var content = new StringContent(JsonSerializer.Serialize(promptJson), Encoding.UTF8, ApplicationJsonMediaTypeRequest);
|
||||||
|
var responseMessage =
|
||||||
|
await _httpClient.PostAsync("chat/completions", content).ConfigureAwait(false);
|
||||||
|
|
||||||
|
var responseContent = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
var response = JsonSerializer.Deserialize<CompletionChatResponse>(responseContent, _serializerOptions);
|
||||||
|
|
||||||
|
if (response?.Content != null)
|
||||||
|
{
|
||||||
|
return response.Content.Split(";").ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new List<string>
|
||||||
|
{
|
||||||
|
"Talk to you later"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
namespace Temp.OpenAi;
|
||||||
|
|
||||||
|
public record struct CompletionChatChoice
|
||||||
|
{
|
||||||
|
public CompletionChatMessage Message { get; set; }
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
|
||||||
|
namespace Temp.OpenAi;
|
||||||
|
|
||||||
|
public record struct CompletionChatMessage()
|
||||||
|
{
|
||||||
|
[DataMember(Name="role")]
|
||||||
|
public readonly string Role = "user";
|
||||||
|
|
||||||
|
[DataMember(Name="content")]
|
||||||
|
public string? Content { get; set; } = string.Empty;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
namespace Temp.OpenAi;
|
||||||
|
|
||||||
|
public record CompletionChatResponse
|
||||||
|
{
|
||||||
|
public CompletionChatChoice[] Choices { get; set; }
|
||||||
|
public string? Content => Choices.FirstOrDefault().Message.Content;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
|
||||||
|
namespace Temp.OpenAi;
|
||||||
|
|
||||||
|
public class CompletionChatRequest
|
||||||
|
{
|
||||||
|
[DataMember(Name="model")]
|
||||||
|
public readonly string Model = "gpt-3.5-turbo";
|
||||||
|
|
||||||
|
[DataMember(Name="temperature")]
|
||||||
|
public readonly float Temperature = 1f;
|
||||||
|
|
||||||
|
[DataMember(Name="max_tokens")]
|
||||||
|
public readonly int MaxTokens = 256;
|
||||||
|
|
||||||
|
[DataMember(Name="messages")]
|
||||||
|
public IEnumerable<CompletionChatMessage>? Messages { get; set; }
|
||||||
|
}
|
||||||
|
|
@ -1,35 +1,33 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Twilio;
|
using Twilio;
|
||||||
|
using Twilio.Rest.Api.V2010.Account;
|
||||||
|
|
||||||
namespace Hacker_Scripts
|
//Exit early if any session with my username is found
|
||||||
|
if (args[0] is null)
|
||||||
{
|
{
|
||||||
class SmackMyBitch
|
return;
|
||||||
{
|
|
||||||
public static string TWILIO_ACCOUNT_SID = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID");
|
|
||||||
public static string AUTH_TOKEN = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN");
|
|
||||||
|
|
||||||
public static string YOUR_NUMBER = "9879789978";
|
|
||||||
public static string HER_NUMBER = "3213213233";
|
|
||||||
|
|
||||||
static void Main(string[] args)
|
|
||||||
{
|
|
||||||
var twilio = new TwilioRestClient(TWILIO_ACCOUNT_SID, AUTH_TOKEN);
|
|
||||||
|
|
||||||
string[] randomMessages = {
|
|
||||||
"Working hard",
|
|
||||||
"Gotta ship this feature",
|
|
||||||
"Someone fucked the system again"
|
|
||||||
};
|
|
||||||
|
|
||||||
int randomIndex = new Random().Next(randomMessages.Count());
|
|
||||||
String messageToSend = (randomMessages[randomIndex]);
|
|
||||||
|
|
||||||
var message = twilio.SendMessage(YOUR_NUMBER, HER_NUMBER, messageToSend);
|
|
||||||
Console.WriteLine(message.Sid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var twilioAccountSid = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID");
|
||||||
|
var authToken = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN");
|
||||||
|
|
||||||
|
//Phone numbers
|
||||||
|
const string myNumber = "+xxx";
|
||||||
|
const string herNumber = "+xxx";
|
||||||
|
|
||||||
|
TwilioClient.Init(twilioAccountSid, authToken);
|
||||||
|
|
||||||
|
var excuses = await new ChatGpt().GetReasonsToMyBitch();
|
||||||
|
|
||||||
|
var randomNumber = new Random().Next(reasons.Length);
|
||||||
|
var reason = reasons[randomNumber];
|
||||||
|
var message = $"Late at work. {reason}";
|
||||||
|
|
||||||
|
//Send a text message
|
||||||
|
MessageResource.Create(
|
||||||
|
body: message,
|
||||||
|
from: new Twilio.Types.PhoneNumber(myNumber),
|
||||||
|
to: new Twilio.Types.PhoneNumber(herNumber)
|
||||||
|
);
|
||||||
|
|
||||||
|
//Log this
|
||||||
|
Console.WriteLine($@"Message sent at: #{DateTime.Now} | Reason: #{reason}");
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
English | [简体中文](./README.zh-CN.md)
|
English | [简体中文](./README.zh-CN.md) | [Português](./README.pt-BR.md)
|
||||||
|
|
||||||
# Hacker Scripts
|
# Hacker Scripts
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
[English](./README.md) | [简体中文](./README.zh-CN.md) | Português
|
||||||
|
|
||||||
|
# Scripts de Hacker
|
||||||
|
|
||||||
|
Baseado numa _[história real](https://www.jitbit.com/alexblog/249-now-thats-what-i-call-a-hacker/)_:
|
||||||
|
|
||||||
|
> xxx: Ok, então, nosso engenheiro de construção se mudou para outra empresa. O cara vivia literalmente dentro do terminal. Sabe, aquele tipo de pessoa que ama o Vim, cria diagramas em Dot e escreve postagens de wiki em Markdown... Se algo - qualquer coisa - requer mais do que 90 segundos do tempo dele, ele escreve um script para automatizar isso.
|
||||||
|
|
||||||
|
> xxx: Então estamos aqui, revendo a sua, hmm, "herança"
|
||||||
|
|
||||||
|
> xxx: Você vai adorar isso.
|
||||||
|
|
||||||
|
> xxx: [`smack-my-bitch-up.sh`](https://github.com/NARKOZ/hacker-scripts/blob/master/smack-my-bitch-up.sh) - envia uma mensagem de texto "trabalhando até tarde" para a esposa dele (aparentemente). Escolhe automaticamente razões de uma matriz de strings, de forma aleatória. Funciona dentro de uma tarefa cron. A tarefa é acionada se houver sessões ativas de SSH no servidor após as 21h com o login dele.
|
||||||
|
|
||||||
|
> xxx: [`kumar-asshole.sh`](https://github.com/NARKOZ/hacker-scripts/blob/master/kumar-asshole.sh) - varre a caixa de entrada em busca de e-mails de "Kumar" (um DBA em nossos clientes). Procura por palavras-chave como "ajuda", "problema", "desculpa", etc. Se as palavras-chave forem encontradas, o script faz uma conexão SSH com o servidor do cliente e restaura o banco de dados de preparação para o último backup. Em seguida, envia uma resposta "sem problemas, amigo, tenha mais cuidado da próxima vez".
|
||||||
|
|
||||||
|
> xxx: [`hangover.sh`](https://github.com/NARKOZ/hacker-scripts/blob/master/hangover.sh) - outra tarefa cron programada para datas específicas. Envia e-mails automáticos como "não me sinto bem/vou trabalhar de casa", etc. Adiciona uma "razão" aleatória de outra matriz predefinida de strings. A tarefa é acionada se não houver sessões interativas no servidor às 8h45 da manhã.
|
||||||
|
|
||||||
|
> xxx: (e o oscar vai para) [`fucking-coffee.sh`](https://github.com/NARKOZ/hacker-scripts/blob/master/fucking-coffee.sh) - Este script aguarda exatamente 17 segundos (!), em seguida, abre uma sessão Telnet para a nossa máquina de café (não tínhamos a menor ideia de que a máquina de café estava na rede, rodava Linux e tinha um soquete TCP funcionando) e envia algo como `sys brew`. Acontece que essa coisa começa a preparar um café latte de tamanho médio com metade da cafeína e espera mais 24 segundos (!) antes de despejá-lo em uma xícara. O cronograma é exatamente o tempo que leva para ir da mesa do cara até a máquina.
|
||||||
|
|
||||||
|
> xxx: puta m*rda vou manter esses
|
||||||
|
|
||||||
|
Original: http://bash.im/quote/436725 (em Russo) (Archive.org [link](https://web.archive.org/web/20210226092253/http://bash.im/quote/436725))
|
||||||
|
Pull requests com outras implementações (Python, Perl, Shell, etc) são bem-vindos.
|
||||||
|
|
||||||
|
## Uso
|
||||||
|
|
||||||
|
Você precisa dessas variáveis de ambiente:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# usado nos scripts `smack-my-bitch-up` e `hangover`
|
||||||
|
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
TWILIO_AUTH_TOKEN=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
|
||||||
|
|
||||||
|
# usado no script `kumar_asshole`
|
||||||
|
GMAIL_USERNAME=admin@example.org
|
||||||
|
GMAIL_PASSWORD=password
|
||||||
|
```
|
||||||
|
|
||||||
|
Para scripts em Ruby você precisa instalar o gems:
|
||||||
|
`gem install dotenv twilio-ruby gmail`
|
||||||
|
|
||||||
|
## Jobs Cron
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Executa o arquivo `smack-my-bitch-up.sh` de segunda a sexta-feira às 21h20.
|
||||||
|
20 21 * * 1-5 /path/to/scripts/smack-my-bitch-up.sh >> /path/to/smack-my-bitch-up.log 2>&1
|
||||||
|
|
||||||
|
# Executa o arquivo `hangover.sh` segunda a sexta-feira às 8h45 da manhã.
|
||||||
|
45 8 * * 1-5 /path/to/scripts/hangover.sh >> /path/to/hangover.log 2>&1
|
||||||
|
|
||||||
|
# Executa o arquivo `kumar-asshole.sh` a cada 10 minutos.
|
||||||
|
*/10 * * * * /path/to/scripts/kumar-asshole.sh
|
||||||
|
|
||||||
|
# Executa o arquivo `fucking-coffee.sh` de hora em hora das 9h às 18h nos dias úteis.
|
||||||
|
0 9-18 * * 1-5 /path/to/scripts/fucking-coffee.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
O código é disponibilizado sob a licença WTFPL.
|
||||||
Loading…
Reference in New Issue