묻고 답해요
144만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
시간이지나면 소스코드가 바뀔수도있나요?
section3 HTML/CSS 이해를 바탕으로 크롤링하기에서https://v.daum.net/v/20170615203441266 해당 사이트에서 크롤링하는 것 때문에 질문드리는 데요 금융당국이 급증하는 가계부채 ~ 분양시장에 뛰어드는 게 사실상 불가능해진다. 이부분을 크롤링하는데 사이트의 페이지 소스를 보니깐 강의와는 달라져 있네요 <p class="link_figure"><img class="thumb_g_article" data-org-src="http://t1.daumcdn.net/news/201706/15/hankooki/20170615044256378kzbd.jpg" data-org-width="330" dmcf-mid="nkjJSoPdyb" dmcf-mtype="image" height="auto" src="https://img1.daumcdn.net/thumb/R658x0.q70/?fname=http://t1.daumcdn.net/news/201706/15/hankooki/20170615044256378kzbd.jpg" width="658"></p> </figure> <p dmcf-pid="n8guDAko3Z" dmcf-ptype="general">금융당국이 급증하는 가계부채 증가세를 막기 위해 아파트 잔금대출에도 소득을 따져 대출한도를 정하는 총부채상환비율(DTI)을 적용하는 방안을 유력하게 검토하고 있다. 지금은 집값을 기준으로 대출한도를 매기는 주택담보인정비율(LTV) 규제만 적용돼 소득이 없어도 집값의 70%를 빌려 잔금을 치르는 게 가능하다. 앞으로 잔금대출에 DTI가 적용되면 소득 없는 사람이 입주 뒤 집값 상승을 노리고 분양시장에 뛰어드는 게 사실상 불가능해진다. </p> <p dmcf-pid="nYPaCCRO1q" dmcf-ptype="general">금융당국 고위관계자는 15일 “잔금대출에도 DTI를 적용하는 방안을 검토 중”이라며 “다만 아직 최종 결론이 난 건 아니다”고 말했다. 정부는 내주 이 같은 내용을 포함한 부동산 종합 대책을 발표할 예정이다. </p> <p dmcf-pid="naZLBbSgoZ" dmcf-ptype="general">정부가 잔금대출 DTI 적용 카드를 꺼내는 건, 집단대출을 잡지 않고선 과열된 주택시장을 진정시키기 어렵다는 판단에서다. 실제 정부는 지난해 잔금대출도 대출 초기부터 원리금을 함께 갚도록 하는 여신심사 가이드라인을 도입했지만 이렇다 할 효과를 거두지 못했다. 오히려 정부 대책에도 불구, 집단대출 증가액은 매달 늘어나는 추세인데 지난달엔 2조원으로 올 들어 최고치를 기록했다. </p> <p dmcf-pid="nhAfneUtnA" dmcf-ptype="general">아파트 분양 집단대출은 중도금과 잔금대출로 구분된다. 계약금 10%를 내면 입주 전까지 집값의 60%를 중도금 대출로 받을 수 있다. 중도금 대출은 건설사 보증으로 이뤄져 소득심사를 안 거친다. 잔금대출은 건설사가 아닌 집을 담보로 이뤄지는 대출이다. LTV 규제만 적용돼 소득이 없어도 집값의 70%까지 대출이 가능하다. 때문에 지금은 잔금대출로 집값의 70%를 대출받아 기존 중도금 대출을 갚고 나머지 20%만 본인 돈으로 충당하면 집을 살 수 있다.</p> <p dmcf-pid="nCcfu6DK1b" dmcf-ptype="general">앞으로 잔금대출에 DTI가 적용되면 소득이 없는 사람은 집값의 70% 대출 받는 게 어려워진다. 입주 뒤 집값 상승을 노리는 투기수요를 확실히 걸러낼 초강력 대책이 될 수 있다. 하지만 부작용도 우려된다. 소득이 낮은 사회초년생 등은 청약통장을 갖고도 분양시장에 진입하는 게 어려워지기 때문이다. </p> <p dmcf-pid="nzh7QZekII" dmcf-ptype="general">이에 따라 잔금대출에 DTI를 적용하는 것 역시 지역 등에 따라 선별적으로 이뤄질 가능성이 높다. 현재 당국은 신규 분양 물량부터 규제를 적용할지 아니면 기존 분양 물량까지 규제 범위를 확대할지를 놓고 시뮬레이션을 하고 있다. </p> <p dmcf-pid="nihh22vlmu" dmcf-ptype="general">아울러 당국은 지난 2년간 완화됐던 LTV와 DTI를 다시 강화할 것으로 보인다. 현재 LTV(은행 기준)는 기존 50~60%에서 70%, DTI는 50~60%에서 60%로 완화돼 있는 상태다. 당국은 일괄적인 조이기보다 지역ㆍ집값 수준별로 기준을 다르게 적용하는 방식을 모색할 것으로 보인다.</p> <p dmcf-pid="naJ5HNfuMQ" dmcf-ptype="general">김동욱 기자 kdw1280@hankookilbo.com</p> </section>
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
누적합 문제4 질문
안녕하세요,이 문제에서 prefix 를 만드실 때 처음부터 5*5 리스트를 만드셨는데 이 아이디어는 어떻게 떠올리신 건지 궁금합니다. 저 방식이 누적합 문제를 풀 때 일반적으로 사용되는 방식인가요?저같은 경우에는 4*4형식으로 만들어서 코드를 작성하였는데 이렇게 하니 답은 맞는데 시간 초과가 뜨네용 n, m = map(int, input().split()) box2 = [] for _ in range(n): box2.append(list(map(int, input().split()))) for i in range(n): for j in range(n): if i - 1 >= 0: box2[i][j] += box2[i - 1][j] if j - 1 >= 0: box2[i][j] += box2[i][j - 1] if i - 1 >= 0 and j - 1 >= 0: box2[i][j] -= box2[i - 1][j - 1] # 쿼리 처리 for _ in range(m): x1, y1, x2, y2 = map(int, input().split()) answer = box2[x2 - 1][y2 - 1] if x1 - 2 >= 0: answer -= box2[x1 - 2][y2 - 1] if y1 - 2 >= 0: answer -= box2[x2 - 1][y1 - 2] if x1 - 2 >= 0 and y1 - 2 >= 0: answer += box2[x1 - 2][y1 - 2] print(answer)
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
엑셀 강의 부분 확인 요청드립니다!
안녕하세요 진석님 🙂 엑셀 강의 부분이 누락된 거 같아 확인 요청드립니다! 감사합니다.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
해결됨코딩테스트 [ ALL IN ONE ]
노션 공유 부탁드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요!어제 점심때쯤 결제했는데 아직 노션 공유가 안되었습니다ㅠㅠ 빨리 부탁드립니다!!
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
강의자료 부탁드립니다.
강의자료 부탁드립니다.sylbiaa@naver.com 입니다.
-
해결됨[2024] 실무에서 사용하는 클라우드 보안 프로그래밍 (AWS, Python, Terraform)
boto3 사용자 생성 질문입니다.
AWS에서 계정을 생성하려고 하면 아래와 같은 오류가 발생하는데 어떤 문제일까요? 액세스키와 비밀키까지 모두 적용 되어 있는 상태인데... 강의 안에는 내용이 없는거 같아 문의드립니다. 4. 작성한 코드를 공유해주세요.
-
해결됨코딩테스트 [ ALL IN ONE ]
교재 문의드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의소개에 ( 한 권으로 끝내기! 195페이지 분량 ) 이라는 교재가 제공된다고 되어있는데, 이게 노션으로 공유되는 교재인가요?
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
nginx, gunicorn, daphne 기반 배포 관련하여 질문 좀 드릴게요
안녕하세요~현재까지 공개된 강의 내용과 무관한 질문이지만, 도통 문제 해결 방향을 잡지 못하고 있어 글 남겨 봅니다. ><DRF, Channels, React로 만든 앱을 nginx, gunicorn, daphne 기반으로 배포하려는데, 막힌 지점에서 벗어나질 못하고 있습니다 ㅜnginx, gunicorn, daphne 모두 정상적으로 동작하고 있는 것 같은데, nginx 설정 파일에 등록한 127.0.0.1로 접속하면 "사이트에 연결할 수 없음, 127.0.0.1에서 연결을 거부했습니다"라는 화면이 나옵니다.문제 해결을 위해 추가적으로 살펴봐야 부분에 관해 조언을 해주신다면 너무 감사드리겠습니다!한 가지 찝찝한 부분은, react오 django 프로젝트 폴더를 담고 있는 폴더의 경로는 home/kiwitter인데 home/ubuntu/kiwitter/처럼 현재 제 우분투 환경의 사용자를 중간에 추가해야 진행 시 오류가 발생하지 않더라고요. 가상환경 사용과 관련있는 것 같은데, 어쨌든 그래서 경로 입력 시 home/ubuntu/kiwitter/처럼 중간에 사용자명을 추가하는 방식을 사용하고 있는데, 혹시 지금 문제가 이것과 관련이 있을까 싶어 말씀드립니다.배포 시 React와 Django 프로젝트가 정상적으로 동작하는지 각각 따로 확인하는 방법이 있을까요? Django도 지금처럼 http와 웹소켓으로 클라이언트 요청이 들어오는 경우에 각각의 동작 여부를 개별적으로 살펴볼 수 있는 방법이 있나요? 배포 관련 지식이 없는 데다 하나씩 단계적으로 정상 동작 여부를 점검하지도 못하니 배포의 늪에서 벗어나는 게 더 힘드네요,,파이썬 사랑방에는 모든 게시물이 관리자의 승인을 받아야 되나요? 아니면 가령 일정 등급 이상이 되면 승인 없이 게시물을 자유롭게 올릴 수 있나요? 여기서 질문 드린 부분을 처음에는 페북 파이썬 사랑방 그룹에 질문했었는데 관리자의 검토가 필요하다는 안내를 보고 궁금해서 여쭤봅니다. ✔ 프로젝트 폴더 구조(venv) ubuntu@Ubuntu:~/kiwitter$ ├── kiwitter_backend │ ├── chats │ ├── db.sqlite3 │ ├── kiwitter_backend │ ├── kiwitter.sock │ ├── log │ ├── manage.py │ ├── secrets.json │ ├── staticfiles │ ├── tweets │ └── users ├── kiwitter_frontend │ ├── build │ ├── node_modules │ ├── package.json │ ├── package-lock.json │ ├── public │ ├── README.md │ └── src ├── requirements.txt └── venv ├── bin ├── include ├── lib ├── lib64 -> lib └── pyvenv.cfg ✔ nginx, gunicorn, daphne 동작 상태<sudo systemctl status nginx 명령어 출력 결과><ps aux | grep gunicorn의 출력 결과><ps aux | grep daphne의 출력 결과>✔ nginx, gunicorn, daphne 관련 설정 파일</etc/nginx/sites-available/kiwitter>upstream django_server { server unix:/home/ubuntu/kiwitter/kiwitter_backend/kiwitter.sock; # Gunicorn 소켓 파일 위치 } upstream channels_layer { server localhost:6379; # Daphne 서버 주소 및 포트 } server { listen 80; server_name 127.0.0.1; # 실제 도메인 또는 공용 IP 주소로 변경 # React 앱이 위치한 경로 location / { root /home/ubuntu/kiwitter/kiwitter_frontend/build/; try_files $uri $uri/ /index.html; } location = /favicon.ico { access_log off; log_not_found off; } location /static/ { alias /home/ubuntu/kiwitter/kiwitter_backend/staticfiles/; # STATIC_ROOT 경로 } location /media/ { alias /home/ubuntu/kiwitter/kiwitter_backend/media/; # MEDIA_ROOT 경로 } # API 요청을 Django로 프록시 location /api/ { proxy_pass http://django_server; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # Django admin 페이지 및 기타 Django 경로 location /admin/ { proxy_pass http://django_server; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # WebSocket 요청 처리를 위한 설정 location /ws/ { proxy_pass http://channels_layer; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }</etc/systemd/system/gunicorn.service>[Unit] Description=gunicorn daemon After=network.target [Service] User=ubuntu Group=www-data WorkingDirectory=/home/ubuntu/kiwitter/kiwitter_backend ExecStart=/home/ubuntu/kiwitter/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/kiwitter/kiwitter_backend/kiwitter.sock kiwitter_backend.wsgi:application [Install] WantedBy=multi-user.target</etc/supervisor/conf.d/channels.conf>[fcgi-program:asgi] socket=tcp://localhost:8000 directory=/home/ubuntu/kiwitter/kiwitter_backend command=/home/ubuntu/kiwitter/venv/bin/daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers kiwitter_backend.asgi:application numprocs=2 process_name=asgi%(process_num)d autostart=true autorestart=true stdout_logfile=/home/ubuntu/kiwitter/kiwitter_backend/log/asgi.log redirect_stderr=true✔ Django settings.py... 생략 ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '').split(',') # .env 관련 부분 -> ALLOWED_HOSTS=127.0.0.1,localhost ... 생략 CSRF_TRUSTED_ORIGINS = [ 'http://127.0.0.1:8000', 'http://127.0.0.1', 'http://localhost:8000', 'http://localhost', ] ... 생략 CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { "hosts": [('127.0.0.1', 6379)], # Redis 서버 주소 }, }, }
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
영상 중에 intercept redirect 질문
안녕하세요! 진석님 강의 잘듣고 있습니다.intercept redirect 강의 파트에서 도중에 끊긴 것 같은데 다음 회차에서 이어지는건가요? 확인 부탁드립니다!늘 좋은 강의 감사합니다:)
-
해결됨QGIS 파이썬 자동화 (벡터편) Ver.2
qgis에서 오차범위 내의 객체만 속성 결합을 할 수 있나요?
qgis에서 차량의 주행데이터(point)와 표준노드링크의 링크(line)의 필드 속성을 결합시키고자 합니다.그런데 차량데이터의 heading 값과 링크의 heading값을 오차 범위 내에서 고려하여,차량데이터 필드에 오차 범위 내의 가장 가까운 링크 아이디를 넣는 것이 목표입니다.그래서 heading값의 오차범위가 조건이 되어서 속성을 결합하는 것이 필요할 것 같은데혹시 방법을 아시나요...? 공간 처리 툴박스를 이용하고 싶은데 '최근접 거리를 이용하여 속성을 결합' 과 같이 위치적인 것만 고려하는 기능만 보여서요 ㅠㅠ표현식이나 파이썬이나 플러그인이나 혹시 방법이 있을까요..?
-
미해결처음하는 MongoDB(몽고DB) 와 NoSQL(빅데이터) 데이터베이스 부트캠프 [입문부터 활용까지] (업데이트)
db에 이미지 데이터 저장
- 본 강의 영상 학습 관련 문의에 대해 답변을 드립니다. (어떤 챕터 몇분 몇초를 꼭 기재부탁드립니다)- 이외의 문의등은 평생강의이므로 양해를 부탁드립니다- 현업과 병행하는 관계로 주말/휴가 제외 최대한 3일내로 답변을 드리려 노력하고 있습니다- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 의료영상 데이터 관리를 위해서 db셋업을 해보려고 하는데 이미지데이터같은 경우에는 어떤방식으로 db에 저장을 할수있을까요?
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
VSCode가 아니고 Atom으로 강의 되는건가요
설치는 VSCode를 설명해주셨는데요
-
미해결파이썬으로 뭘 만들지? 남박사의 파이썬 알쓸파잡
선생님 혹시 SSV 파일을 json으로 변환할 방법이 있을까요?
안녕하세요. 선생님 수업을 통해 크롤링까지는 성공했습니다.HTTP POST 요청으로 받아왔는데요. 다만 Response가 넥사크로에서 사용하는 "SSV"형식으로 왔습니다. SSV:UTF-8ErrorCode:string=0ErrorMsg:string=Dataset:ds_PageList_RowType_TAXNO:string(255)TAXIDX:string(255)MEMBNAM:string(255)TSDATE:string(255)TSTIME:string(255)ACQBID:string(255)CARD_NAME:string(255)HID:string(255)ACQHID:string(255)TERMID:string(255)MTRCNO:string(255)CDNO:string(255)AUTHNO:string(255)ISTMMON:string(255)CURRCODE:string(255)AMT1:bigdecimal(25)AMT2:bigdecimal(25)AMT3:bigdecimal(25)ACQDATE:string(255)DDCEDI:string(255)...... <생략>이렇게 못생긴 데이터가 왔는데요.이걸 json으로 파싱하고싶어서요. 이리저리 혼자서 아스키코드 찾아보고 US, RS 사용해서 어떻게든 파싱은 했는데, 제가 짠 로직이 맞나 싶어서요. (일단 작동은 되는데.. ) 혹시 선생님이라면 어떻게 하실까 싶어서요.이런걸 잘 파싱하려면 알고리즘을 공부해야되는걸까요?아! 그리고 깃헙에 혹시 라이브러리가 있나 찾아봤는데요. 안나오더라구요. 이게 제일 슬펐어요. 그나저나 저런거 만드는 사람들은 정말 괴물같네요.. 저런걸 도대체 어떻게 만드는 걸까요? (코드가 본문에 저렇게 붙여넣어지는 기능도 신기하네요.. 저런건 또 어떻게 만드나요?)
-
해결됨실전! FastAPI 입문
코드 질문
안녕하세요.파이썬 2.7만 주로 쓰다 오랜만에 쓰니 좀 헷갈리는게 있어 질문드립니다.encoding: str = "UTF-8"service 작성하시면서 설명해주신 코드인데,encoding = "UTF - 8" 이렇게 써도 encoding 변수에 뭐가 들어가는지 바로 확인이 되는데 굳이 : str 과 타입을 명시할 이유가 있나요 ? 이렇게 작성하였을 때 왜 이렇게 작성하고 어떠한 장점이 있는지 궁금합니다.비슷한 질문으로 def save_user(self, user: User) -> User:다음과 같이 반환 타입을 적어줘야 하는 것도 설명 부탁드립니다.작성하면서도 이걸 굳이 적어줘야 하는지가 궁금해서 질문드립니다.
-
미해결실리콘밸리 엔지니어가 가르치는 파이썬 장고 웹프로그래밍
복습
이제 section 3 까지 학습완료했습니다.이제까지 만들어본걸 강의나 제공된 소스코드 없이 다시 만드는 방식으로 복습하려고 하는데 혹시 추천하는 복습 방법이 있으신가요?
-
해결됨공공데이터로 파이썬 데이터 분석 시작하기
주피터노트북 ui가 이상해요
익스텐션 설치 후에 주피터 노트북이 안열려서아나콘타랑 주피터 노트북 재설치했는데 ui가 뭔가 예전이랑 미묘하게 달라졌네요.. 어떻게하면 원래대로 되돌릴 수 있을까요? ▲ 원래 ui ▲ 현재 이상하게 바뀐 ui
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
주피터 노트북 err_connection_refused
안녕하세요, 좋은 강의 잘 수강하고 있습니다.주피터노트북 실행 시, url을 크롬브라우저에 붙여넣어 접근은 가능한데, 주피터노트북 확장자 파일도 정상적으로 열리지만 그 후 다른 상위 폴더접근 또는 다른 파일 오픈 시 jupyter notebook err_connection_refused, 주피터 노트북 사이트에 연결할 수 없음 이라는 경고메시지가 안내됩니다.그래서 매 번 주피터노트북을 다시 실행하여 접근하는 불편함이 있는데 이러한 이유는 무엇이고 어떻게 하면 연결이 끊기지 않고 사용할 수 있는지 문의드립니다. 감사합니다. 😀
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
파이썬 시작합니다. 강의자료 부탁드려요
이메일 nhshin00@gmail.com
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
최신 셀레니움 테스트 소프트에 의해 제어...
안녕하세요~예전에 셀레니움좀 하다가 다시 최근에 만지작 하고 있습니다.최신 셀레니움의 경우 크롬드라이버 버전 다운로드 필요없이 되더라구요! 아무튼 셀레니움 options값을 통해서 자동화제어창 문구 안뜨게 하고,user agent 값에 정상적인걸 나오게 해놓으면 상대방 서버에 접속했을 때 티가 안날까요?나쁜짓 하려는건 아니고,네이버랑 다음에서그냥 단순반복 작업을 셀레니움으로 시킬까 하는데 이게 이상하게 보일까 싶어서 궁금합니다.과도하게 요청하는것도 아니고 그냥 느릿느릿하게 작업하게 했거든요. 근데 이렇게 숨겨도 맘먹고 찾아내서 조치를 취할 수 있을까요?
-
미해결[자동화 완전 정복] 인스타그램 휴대폰, 웹 자동화 프로그램 개발
insta_mobile.py 링크만 무한루프 뜹니다. 왜 그런가요?
def insta_mobile_work(device, max_work): links = read_links() print(links) cnt = 1 for link in links: if cnt >= max_work: print(link) print("이제 작업 종료하겠습니다") break try: visited_links = [] # 이미 좋아요, 댓글, 팔로우를 신청한 링크 리스트 with open('visited.txt', 'r') as f: while True: line = f.readline() if not line: break _link = line.rstrip() visited_links.append(_link) if link in visited_links: print("이미 방문한 링크입니다.") continue print(f"{cnt} 번째 링크 방문 {link}") # link = link.replace("https://","") device.press('home') device.open_url(link) time.sleep(0.2) if device(text="작업을 수행할 때 사용하는 애플리케이션").exists(timeout=2): # 삭제되었거나, 잘못된 URL 저장된 경우에 continue continue ''' visited_account check 목표 : 최대 3회까지 계정 방문하는 기능 ''' visited_accounts = [] with open('./visited_account.txt', "r") as f: while True: line = f.readline() if not line: break account = line.rstrip() visited_accounts.append(account) # 몇 번 방문했는지 정보 획득 account_id = device(resourceId="com.instagram.android:id/row_feed_photo_profile_name").get_text() visited_count = visited_accounts.count(account_id) if visited_count >= 3: # 3회 이상 방문일 때는 다음 링크를 방문하도록 한다 # continue가 실행되면 여기 밑에있는 코드가 실행이 안됨 (for 문 안에서 사용가능) continue ''' 1. 좋아요 누르기 - 단, 좋아요가 이미 눌러져 있으면 Pass ''' # 좋아요 버튼 나타나는것 기준으로 5초까지 대기 if not device(resourceId="com.instagram.android:id/row_feed_button_like").exists(timeout=3): device.swipe_ext("up", scale=0.75) time.sleep(3) alreadyLiked = False if device(resourceId="com.instagram.android:id/row_feed_button_like").exists( timeout=5): # 만약 ,좋아요 버튼이 안 눌러져있으면 좋아요 버튼을 누른다 if device(resourceId="com.instagram.android:id/row_feed_button_like", selected=False): device(resourceId="com.instagram.android:id/row_feed_button_like").click() time.sleep(1) if check_bot_detection(device): print("[봇 탐지] - 좋아요 시도 실패") raise Exception("[봇 탐지] - 좋아요 시도 실패") else: alreadyLiked = True time.sleep(3) # ''' # 2. 댓글 달기 - 랜덤 멘트를 미리 작성해놓고, 랜덤으로 뽑아서 댓글 달기''' # if not alreadyLiked: # device(resourceId="com.instagram.android:id/row_feed_button_comment").click() # time.sleep(3) # # 기본 키보드가 활성화 되어있는 경우 back버튼을 눌러줌 # if device(resourceId="com.samsung.android.honeyboard:id/bee_item_icon").exists(): # device.press('back') # time.sleep(1) # if not device(text="이 게시물에 대한 댓글 기능이 제한되었습니다.").exists(): # print("커멘트 작성 가능 exists") # device(resourceId="com.instagram.android:id/layout_comment_thread_edittext").click() # # 실제 사람이 작성하는 것처럼 문장 사이의 타이핑 딜레이가 들어감 # comments = ["♡", "❤️", "❤️❤️", "♥"] # comment = random.choice(comments) # for word in comment: # device.send_keys(word) # time.sleep(random.uniform(0.03, 0.08)) # print("댓글 작성 완료") # time.sleep(3) # if device( # resourceId="com.instagram.android:id/layout_comment_thread_post_button_click_area").exists(): # device( # resourceId="com.instagram.android:id/layout_comment_thread_post_button_click_area").click() # elif device(resourceId="com.instagram.android:id/layout_comment_thread_post_button").exists(): # device(resourceId="com.instagram.android:id/layout_comment_thread_post_button").click() # time.sleep(1) # if check_bot_detection(device): # print("[봇 탐지] - 댓글 달기 시도 실패") # raise Exception("[봇 탐지] - 댓글 달기 시도 실패") # print("게시 버튼 꾸욱.") # time.sleep(2) # device.press('back') # time.sleep(2) # device.press('back') # else: # device.press('back') # time.sleep(3) # 방문 1회 추가 ! with open('./visited_account.txt', "a") as f: f.write(f"{account_id}\n") # 3. 팔로우 신청 - 단, 이미 팔로잉 상태면 Pass # 사진 사이즈가 너무 크면, 위로 스와이프 해줘야함 device.swipe_ext("down", scale=0.8) time.sleep(3) account_ids = [] # 이미 팔로우를 신청한 계정 리스트 with open('accounts.txt', "r") as f: while True: line = f.readline() if not line: break account_id = line.rstrip() account_ids.append(account_id) if not device(resourceId="com.instagram.android:id/row_feed_photo_profile_name").exists(): device.press('back') time.sleep(1) target_account_id = device(resourceId="com.instagram.android:id/row_feed_photo_profile_name").get_text() # 딱 1번만 팔로우 하겠다. if not target_account_id in account_ids: # 팔로우할 유저의 계정을 기록 with open('accounts.txt', "a") as f: account_id = device(resourceId="com.instagram.android:id/row_feed_photo_profile_name").get_text() f.write(f"{account_id}\n") device(resourceId="com.instagram.android:id/row_feed_photo_profile_name").click() time.sleep(3) if device(description="맞팔로우 하기", text="맞팔로우").exists(): device(description="맞팔로우 하기", text="맞팔로우").click() elif device(text="팔로우", className="android.widget.Button"): device(text="팔로우", className="android.widget.Button").click() else: # 이미 맞 팔로우가 되어 있으므로 실행시키지 않아도 됨 pass time.sleep(1) if check_bot_detection(device): print("[봇 탐지] - 팔로우, 맞팔로우 신청 시도 실패") raise Exception("[봇 탐지] - 팔로우, 맞팔로우 신청 시도 실패") time.sleep(2) device.press("back") time.sleep(2) device.press("back") time.sleep(3) else: print("이미 팔로우된 계정입니다") cnt += 1 random_time = random.randrange(60, 90) print(random_time, '초만큼 대기하겠습니다') time.sleep(random_time) '좋아요, 팔로우, 댓글 작성까지 완료된 게시글' with open('visited.txt', 'a') as f: f.write(f"{link}\n") except: pass 1 번째 링크 방문 https://www.instagram.com/p/C2DUpJJBWI1/1 번째 링크 방문 https://www.instagram.com/p/C3SMeJSyIRC/1 번째 링크 방문 https://www.instagram.com/p/C3fDCYiM4gt/1 번째 링크 방문 https://www.instagram.com/p/C2hjVjmxPEg/왜그런가요?