// PHP 설정 변경 함수
function set_custom_upload_limits() {
@ini_set('upload_max_filesize', '8192M');
@ini_set('post_max_size', '8192M');
@ini_set('max_execution_time', '1200');
@ini_set('max_input_time', '1200');
}
// init 액션에 함수 연결 (우선순위 1로 설정)
add_action('init', 'set_custom_upload_limits', 1);
add_action('wp_footer', function() {
// 현재 로그인한 사용자가 관리자가 아닌 경우에만 스크립트 실행
if (!current_user_can('manage_options')) {
?>
<!-- Insert Footers START -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
jQuery(document).ready(function($) {
// 마우스 오른쪽 클릭 차단
$(document).on('contextmenu', function(e) {
e.preventDefault(); // 기본 동작 방지
});
// 마우스 드래그로 텍스트 선택 방지 (단, 입력 상자와 텍스트 영역 제외)
$(document).on('mousedown', function(e) {
if (e.target.nodeName !== "INPUT" && e.target.nodeName !== "TEXTAREA") {
e.preventDefault(); // 기본 동작 방지
}
});
// Ctrl + C, Ctrl + A 단축키 감지
$(document).on('keydown', function(e) {
if (e.ctrlKey && (e.keyCode == 67 || e.keyCode == 65)) { // Ctrl + C or Ctrl + A
// Ctrl + C를 눌렀을 때 선택한 텍스트가 있으면 출처 추가 후 복사
if (e.keyCode == 67 && window.getSelection().toString().length > 0) {
var originalText = window.getSelection().toString(); // 현재 선택된 텍스트
var appendText = ' 출처: ' + window.location.href; // 현재 페이지 URL을 출처로 추가
var newCopyText = originalText + appendText; // 원본 텍스트에 출처 추가
navigator.clipboard.writeText(newCopyText); // 클립보드에 새 텍스트 저장
e.preventDefault(); // 기본 복사 동작 방지
// Ctrl + A를 눌렀을 때 텍스트 선택 방지
} else if (e.keyCode == 65) {
e.preventDefault(); // 기본 동작 방지
}
}
});
});
</script>
<!-- Insert Footers END -->
<?php
}
});
이러한 기능을 WordPress에 구현하려면 WordPress 플러그인을 만들거나 WordPress 테마 기능.php 파일에 코드를 추가할 수 있습니다.
아래는 WordPress의 functions.php 파일에 추가할 수 있는 간단한 코드의 예입니다. 이 코드는 사용자의 IP 주소와 액세스 시간을 세션에 저장하고, 동일한 페이지나 파일에 1분에 10번 이상 액세스하는 사용자의 IP 주소를 차단합니다.
function check_and_block_repeated_requests() {
session_start();
$user_ip = $_SERVER['REMOTE_ADDR'];
$current_page = $_SERVER['REQUEST_URI'];
$key = $user_ip . '_' . $current_page;
if (!isset($_SESSION[$key])) {
$_SESSION[$key] = array('timestamp' => time(), 'count' => 0);
}
// Check if user has accessed the page within the last 60 seconds
if (time() - $_SESSION[$key]['timestamp'] < 60) {
$_SESSION[$key]['count'] += 1;
} else {
$_SESSION[$key] = array('timestamp' => time(), 'count' => 0);
}
// If user accessed the page more than 10 times in the last 60 seconds, block them
if ($_SESSION[$key]['count'] > 10) {
die('You have been temporarily blocked due to excessive requests.');
}
}
add_action('init', 'check_and_block_repeated_requests');
현재 WordPress에서 활성화된 function.php 파일에 이 코드를 추가할 수 있습니다.
참고:
이 코드는 세션을 사용하여 사용자 액세스 수를 추적합니다. 일부 WordPress 환경에서는 세션 설정이 필요할 수 있습니다. 위 코드는 예제일 뿐이며 프로덕션 배포를 위해 테스트 및 검증이 필요합니다. 이러한 기능은 웹 서버, CDN 또는 WAF 수준에서도 구현할 수 있으며 보다 효과적입니다.
C#
using System;
public class Program
{
public static void Main()
{
int startNumber = 1;
int endNumber = 5;
string baseUrl = "https://search.naver.com/search.naver?nso=&page={0}&qdt=-1&query=%EC%A0%95%EB%B6%80%EC%A7%80%EC%9B%90%EC%84%9C%EB%AF%BC%EB%8C%80%EC%B6%9C+tistory.com&qvt=-1&sm=tab_pag&start={1}&where=web";
for (int number = startNumber; number <= endNumber; number++)
{
string url = string.Format(baseUrl, number, CalculateStartValue(number));
Console.WriteLine(url);
}
}
public static int CalculateStartValue(int pageNumber)
{
return (pageNumber - 1) * 15 + 1;
}
}
나온 URL을 바탕으로 페이지 파씽하는 소스코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
string url = "http://example.com"; // 파싱할 웹 페이지 URL
string pattern = @"(tistory\.com)"; // 추출할 문자열 패턴
List<string> list_tistory = new List<string>();
try
{
using (WebClient client = new WebClient())
{
string html = client.DownloadString(url); // 웹 페이지의 HTML 가져오기
// 정규식 패턴을 사용하여 "tistory.com" 문자열 추출
MatchCollection matches = Regex.Matches(html, pattern);
foreach (Match match in matches)
{
string tistory = match.Value;
if (!list_tistory.Contains(tistory))
{
list_tistory.Add(tistory);
}
}
}
// 중복 없이 추출된 "tistory.com" 문자열 출력
foreach (string tistory in list_tistory)
{
Console.WriteLine(tistory);
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
자바스크립트 소스코드
JAVASCRIPT
function generateURLs(startNumber, endNumber) {
var baseUrl = "https://search.naver.com/search.naver?nso=&page={0}&qdt=-1&query=%EC%A0%95%EB%B6%80%EC%A7%80%EC%9B%90%EC%84%9C%EB%AF%BC%EB%8C%80%EC%B6%9C+tistory.com&qvt=-1&sm=tab_pag&start={1}&where=web";
for (var number = startNumber; number <= endNumber; number++) {
var startValue = calculateStartValue(number);
var url = baseUrl.replace("{0}", number).replace("{1}", startValue);
console.log(url);
}
}
function calculateStartValue(pageNumber) {
return (pageNumber - 1) * 15 + 1;
}
// 예제 실행
generateURLs(2, 5);
나온 URL을 바탕으로 페이지 파씽하는 소스코드
const url = 'http://example.com'; // 파싱할 웹 페이지 URL
const pattern = /tistory\.com/g; // 추출할 문자열 패턴
const list_tistory = [];
fetch(url)
.then(response => response.text())
.then(html => {
const matches = html.match(pattern);
if (matches) {
const uniqueMatches = new Set(matches);
uniqueMatches.forEach(match => list_tistory.push(match));
// 중복 없이 추출된 "tistory.com" 문자열 출력
list_tistory.forEach(tistory => {
console.log(tistory);
});
}
})
.catch(error => console.error(error));
php 소스코드
PHP
<?php
function generateURLs($startNumber, $endNumber) {
$baseUrl = "https://search.naver.com/search.naver?nso=&page={0}&qdt=-1&query=%EC%A0%95%EB%B6%80%EC%A7%80%EC%9B%90%EC%84%9C%EB%AF%BC%EB%8C%80%EC%B6%9C+tistory.com&qvt=-1&sm=tab_pag&start={1}&where=web";
for ($number = $startNumber; $number <= $endNumber; $number++) {
$startValue = calculateStartValue($number);
$url = str_replace(["{0}", "{1}"], [$number, $startValue], $baseUrl);
echo $url . "\n";
}
}
function calculateStartValue($pageNumber) {
return ($pageNumber - 1) * 15 + 1;
}
// 예제 실행
generateURLs(2, 5);
?>
나온 URL을 바탕으로 페이지 파씽하는 소스코드
<?php
$url = 'http://example.com'; // 파싱할 웹 페이지 URL
$pattern = '/tistory\.com/'; // 추출할 문자열 패턴
$list_tistory = [];
$html = file_get_contents($url);
if ($html !== false) {
preg_match_all($pattern, $html, $matches);
if (!empty($matches[0])) {
$uniqueMatches = array_unique($matches[0]);
$list_tistory = array_merge($list_tistory, $uniqueMatches);
// 중복 없이 추출된 "tistory.com" 문자열 출력
foreach ($list_tistory as $tistory) {
echo $tistory . "\n";
}
}
}
?>
JAVA 언어 소스코드
JAVA
public class URLGenerator {
public static void main(String[] args) {
int startNumber = 2;
int endNumber = 5;
generateURLs(startNumber, endNumber);
}
public static void generateURLs(int startNumber, int endNumber) {
String baseUrl = "https://search.naver.com/search.naver?nso=&page={0}&qdt=-1&query=%EC%A0%95%EB%B6%80%EC%A7%80%EC%9B%90%EC%84%9C%EB%AF%BC%EB%8C%80%EC%B6%9C+tistory.com&qvt=-1&sm=tab_pag&start={1}&where=web";
for (int number = startNumber; number <= endNumber; number++) {
int startValue = calculateStartValue(number);
String url = baseUrl.replace("{0}", Integer.toString(number)).replace("{1}", Integer.toString(startValue));
System.out.println(url);
}
}
public static int calculateStartValue(int pageNumber) {
return (pageNumber - 1) * 15 + 1;
}
}
나온 URL을 바탕으로 페이지 파씽하는 소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String url = "http://example.com"; // 파싱할 웹 페이지 URL
String pattern = "(tistory\\.com)"; // 추출할 문자열 패턴
List<String> list_tistory = new ArrayList<>();
try {
URL urlObj = new URL(url);
BufferedReader reader = new BufferedReader(new InputStreamReader(urlObj.openStream()));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
reader.close();
String html = stringBuilder.toString();
Pattern regex = Pattern.compile(pattern);
Matcher matcher = regex.matcher(html);
Set<String> uniqueMatches = new HashSet<>();
while (matcher.find()) {
String tistory = matcher.group(1);
if (!uniqueMatches.contains(tistory)) {
list_tistory.add(tistory);
uniqueMatches.add(tistory);
}
}
// 중복 없이 추출된 "tistory.com" 문자열 출력
for (String tistory : list_tistory) {
System.out.println(tistory);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
이렇게 숫자 1부터 100을 입력 할 경우 1페이지부터 100페이지까지 URL을 만들어줍니다.
나온 URL을 바탕으로 각 페이지를 파씽하면 원하는 항목을 추출할 수 있습니다.
다음 시간에는 추출한 리스트를 데이터베이스에 입력하는 시간을 만들어보도록 하겠습니다.
티스토리 블로그 애드센스 고수익내고 계신분들이 자신의 도메인을 꽁꽁 숨겨서 유튜브에서 활동하시는것 같아.
이왕 오픈할꺼면 도메인도 함께 스스로 오픈 하길 바라는 마음으로 알고리즘을 만들어보았습니다.